[Home] [Help]
PACKAGE BODY: APPS.ENG_WORKFLOW_UTIL
Source
1 PACKAGE BODY Eng_Workflow_Util AS
2 /* $Header: ENGUWKFB.pls 120.37.12020000.6 2013/05/22 03:36:15 leizhzha 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 --Bug 11802032 Start
8281 --Note: To check whether ENG_CHANGE_ROUTE_PEOPLE includes null wf_notification_id or not.
8282 l_chg_rte_cnt_nonull_ntfid NUMBER := 0;
8283 --Bug 11802032 END
8284
8285 CURSOR c_route_person ( p_step_id NUMBER
8286 , p_notification_id NUMBER )
8287 IS
8288 SELECT /*+ push_pred(engsecpeople) */ EngSecPeople.user_id --bug 14743524
8289 , EngSecPeople.person_id
8290 , RoutePeople.route_people_id
8291 , RoutePeople.adhoc_people_flag
8292 , RoutePeople.assignee_type_code
8293 , RoutePeople.original_assignee_id
8294 , RoutePeople.original_assignee_type_code
8295 , RoutePeople.response_condition_code
8296 FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
8297 , ENG_SECURITY_PEOPLE_V EngSecPeople
8298 , WF_NOTIFICATIONS wn
8299 WHERE RoutePeople.assignee_id = EngSecPeople.person_id
8300 -- AND RoutePeople.assignee_type_code = p_assignee_type_code
8301 AND RoutePeople.step_id = p_step_id
8302 AND EngSecPeople.user_name = wn.recipient_role
8303 AND wn.notification_id = p_notification_id ;
8304
8305 --Bug 11802032 Start
8306 -- Note: If p_chg_rte_cnt_nonul_ntfid >0, c_route_person_ntf includes only nonull wf_notification_id rows.
8307 -- If p_chg_rte_cnt_nonul_ntfid =0, c_route_person_ntf includes only null wf_notification_id rows.
8308 -- To trace transfer history, do not include 'Transferred' nor 'Delegated' response_code's.
8309 CURSOR c_route_person_ntf ( p_step_id NUMBER
8310 , p_notification_id NUMBER
8311 , p_chg_rte_cnt_nonull_ntfid NUMBER)
8312 IS
8313 SELECT /*+ push_pred(engsecpeople) */ EngSecPeople.user_id -- 16324566
8314 , EngSecPeople.person_id
8315 , RoutePeople.route_people_id
8316 , RoutePeople.adhoc_people_flag
8317 , RoutePeople.assignee_type_code
8318 , RoutePeople.original_assignee_id
8319 , RoutePeople.original_assignee_type_code
8320 , RoutePeople.response_condition_code
8321 FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
8322 , ENG_SECURITY_PEOPLE_V EngSecPeople
8323 , WF_NOTIFICATIONS wn
8324 WHERE RoutePeople.assignee_id = EngSecPeople.person_id
8325 AND RoutePeople.step_id = p_step_id
8326 AND EngSecPeople.user_name = wn.recipient_role
8327 AND ( RoutePeople.response_code <> Eng_Workflow_Util.G_ACT_DELEGATED
8328 AND RoutePeople.response_code <> Eng_Workflow_Util.G_RT_TRANSFERRED
8329 AND RoutePeople.response_code <> Eng_Workflow_Util.G_RT_FORWARDED
8330 AND RoutePeople.response_code <> Eng_Workflow_Util.G_ACT_TRANSFERRED ) -- Bug 11802032
8331 AND wn.notification_id = p_notification_id
8332 AND ( ( p_chg_rte_cnt_nonull_ntfid > 0 and RoutePeople.wf_notification_id = p_notification_id )
8333 OR ( p_chg_rte_cnt_nonull_ntfid = 0 and RoutePeople.wf_notification_id is null)) ;
8334 --Bug 11802032 End
8335
8336 CURSOR c_duplicate_ntf ( p_item_type VARCHAR2
8337 , p_item_key VARCHAR2
8338 , p_orig_ntf_id NUMBER )
8339 IS
8340 SELECT ntf.NOTIFICATION_ID,
8341 ntf.RECIPIENT_ROLE,
8342 ntf.MESSAGE_NAME,
8343 ntf.message_type
8344 FROM WF_ITEM_ACTIVITY_STATUSES wias,
8345 WF_NOTIFICATIONS ntf ,
8346 WF_NOTIFICATIONS orig_ntf
8347 WHERE ntf.STATUS = 'OPEN'
8348 AND wias.NOTIFICATION_ID = ntf.group_id
8349 AND wias.NOTIFICATION_ID IS NOT NULL
8350 AND (wias.ACTIVITY_STATUS = 'NOTIFIED' OR wias.ACTIVITY_STATUS = 'ERROR')
8351 AND wias.ITEM_TYPE = p_item_type
8352 AND wias.ITEM_KEY = p_item_key
8353 AND ntf.RECIPIENT_ROLE = orig_ntf.RECIPIENT_ROLE
8354 AND ntf.GROUP_ID = orig_ntf.GROUP_ID
8355 AND ntf.NOTIFICATION_ID <> orig_ntf.NOTIFICATION_ID
8356 AND orig_ntf.NOTIFICATION_ID = p_orig_ntf_id
8357 AND EXISTS (SELECT 1
8358 FROM WF_NOTIFICATION_ATTRIBUTES na,
8359 WF_MESSAGE_ATTRIBUTES ma
8360 WHERE na.NOTIFICATION_ID = ntf.NOTIFICATION_ID
8361 AND ma.MESSAGE_NAME = ntf.MESSAGE_NAME
8362 AND ma.MESSAGE_TYPE = ntf.MESSAGE_TYPE
8363 AND ma.NAME = na.NAME
8364 AND ma.SUBTYPE = 'RESPOND') ;
8365
8366
8367
8368 BEGIN
8369
8370 -- For Test/Debug
8371 Check_And_Open_Debug_Session(p_debug_flag => FND_API.G_FALSE
8372 , p_output_dir => NULL
8373 , p_file_name => NULL
8374 ) ;
8375
8376
8377 IF g_debug_flag THEN
8378 Write_Debug('Eng_Workflow_Util.SetRouteResponse Log');
8379 Write_Debug('-----------------------------------------------------');
8380 Write_Debug('Item Type : ' || p_item_type );
8381 Write_Debug('Item Key : ' || p_item_key );
8382 Write_Debug('NTF Id : ' || to_char(p_notification_id) );
8383 Write_Debug('Response Code : ' || p_response_code );
8384 Write_Debug('Comment : ' || SUBSTR(p_comment,200));
8385 Write_Debug('-----------------------------------------------------');
8386 END IF ;
8387
8388 -- Initialize API return status to success
8389 x_return_status := FND_API.G_RET_STS_SUCCESS;
8390
8391 -- Initialize Table var
8392 l_target_obj_tbl := FND_TABLE_OF_VARCHAR2_30();
8393 l_person_id_tbl := FND_TABLE_OF_NUMBER();
8394
8395 -- Get Change Object Identifier
8396 GetChangeObject
8397 ( p_item_type => p_item_type
8398 , p_item_key => p_item_key
8399 , x_change_id => l_change_id
8400 ) ;
8401
8402 -- Get Object Type
8403 l_object_name := GetChangeObjectName
8404 ( p_change_id => l_change_id ) ;
8405
8406 -- Get Current Route Step Id
8407 GetRouteStepId
8408 ( p_item_type => p_item_type
8409 , p_item_key => p_item_key
8410 , x_route_step_id => l_step_id
8411 ) ;
8412
8413
8414 -- R12B
8415 -- Get Route Id
8416 GetRouteId
8417 ( p_item_type => p_item_type
8418 , p_item_key => p_item_key
8419 , x_route_id => l_route_id
8420 ) ;
8421
8422 -- Get Change Object Identifier
8423 GetChangeLineObject
8424 ( p_item_type => p_item_type
8425 , p_item_key => p_item_key
8426 , x_change_line_id => l_change_line_id
8427 ) ;
8428
8429
8430 l_base_change_mgmt_type_code := GetBaseChangeMgmtTypeCode(p_change_id =>l_change_id);
8431
8432 if l_base_change_mgmt_type_code = 'NEW_ITEM_REQUEST'
8433 AND p_response_code ='APPROVED'
8434 AND ENG_NIR_UTIL_PKG.checkNIRValidForApproval(p_change_id => l_change_id)
8435 then
8436 -- fnd_message.set_name('ENG','ENG_NIR_CANNOT_APPROVE');
8437 -- app_exception.raise_exception;
8438
8439 l_message_text := fnd_message.get_String('ENG','ENG_NIR_CANNOT_APPROVE');
8440 wf_core.token('ERRCODE', l_message_text);
8441 wf_core.raise('WFENG_NOTIFICATION_FUNCTION');
8442
8443 end if;
8444
8445 --9615312
8446 if l_base_change_mgmt_type_code = 'NEW_ITEM_REQUEST'
8447 AND p_response_code ='APPROVED'
8448 --13717209
8449 AND (NOT ENG_NIR_UTIL_PKG.checkSKUNIRValidForApproval(p_change_id =>l_change_id))
8450 then
8451 l_message_text := fnd_message.get_String('ENG','ENG_SKU_NIR_CANNOT_APPROVE');
8452 wf_core.token('ERRCODE', l_message_text);
8453 wf_core.raise('WFENG_NOTIFICATION_FUNCTION');
8454 end if;
8455
8456
8457
8458 IF p_comment IS NULL THEN
8459
8460 /*
8461 l_comment := WF_NOTIFICATION.GetAttrText
8462 ( nid => p_notification_id
8463 , aname => 'RESPONSE_COMMENT');
8464 */
8465
8466 l_comment := WF_NOTIFICATION.GetAttrText
8467 ( nid => p_notification_id
8468 , aname => 'WF_NOTE');
8469
8470
8471 IF g_debug_flag THEN
8472 Write_Debug('Responded Comment: ' || SUBSTR(l_comment, 1, 200));
8473 END IF ;
8474
8475 ELSE
8476
8477 l_comment := p_comment ;
8478
8479 END IF ;
8480
8481 -- Filter default value : no value specified
8482 l_comment := DefaultNoValueFilter(p_text => l_comment ) ;
8483
8484
8485 IF g_debug_flag THEN
8486 Write_Debug('Get Action Desc after filering: ' || SUBSTR(l_comment, 1, 200) );
8487 END IF ;
8488
8489 -- In this reslease assignee type is only 'PERSON' for Workflow Routing Instance
8490 -- l_assignee_type_code := 'PERSON' ;
8491
8492 IF g_debug_flag THEN
8493 Write_Debug('Getting corresponding route people info ' ) ;
8494 Write_Debug('step_id : ' || to_char(l_step_id) ) ;
8495 Write_Debug('notification_id : ' || to_char(p_notification_id) ) ;
8496 END IF ;
8497
8498 --Bug 11802032 Start
8499 --Note: Check whether ENG_CHANGE_ROUTE_PEOPLE has wf_notification_id or not.
8500 -- bug 16324566, not use count(), add hint
8501 begin
8502 SELECT /*+ push_pred(ENGSECPEOPLE) */ 1
8503 into l_chg_rte_cnt_nonull_ntfid
8504 FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
8505 , ENG_SECURITY_PEOPLE_V EngSecPeople
8506 , WF_NOTIFICATIONS wn
8507 WHERE RoutePeople.assignee_id = EngSecPeople.person_id
8508 AND RoutePeople.step_id = l_step_id
8509 AND EngSecPeople.user_name = wn.recipient_role
8510 AND wn.notification_id = p_notification_id
8511 AND RoutePeople.wf_notification_id = p_notification_id
8512 AND rownum = 1;
8513 exception
8514 when no_data_found then
8515 l_chg_rte_cnt_nonull_ntfid := 0;
8516 END;
8517
8518 --Bug 11802032 End
8519
8520 FOR rtp_rec IN c_route_person_ntf ( p_step_id => l_step_id
8521 , p_notification_id => p_notification_id
8522 , p_chg_rte_cnt_nonull_ntfid => l_chg_rte_cnt_nonull_ntfid) --Bug 11802032
8523 LOOP
8524 l_performer_user_id := rtp_rec.user_id ;
8525 l_performer_party_id := rtp_rec.person_id ;
8526 l_route_people_id := rtp_rec.route_people_id ;
8527
8528 --
8529 -- Comment Out: Not Used
8530 -- l_adhoc_people_flag := rtp_rec.adhoc_people_flag ;
8531 -- l_assignee_type_code := rtp_rec.assignee_type_code ;
8532 -- l_original_assignee_id := rtp_rec.original_assignee_id ;
8533 -- l_original_assignee_type_code := rtp_rec.original_assignee_type_code ;
8534 -- l_response_condition_code := rtp_rec.response_condition_code ;
8535
8536 /* COMMENT OUT
8537 * There is issue if user uses different session lang
8538 * between responding to ntf and viewing response
8539 * if we use UPDATE_ROW api, the response is only updated with
8540 * the lang record used while responding to ntf
8541
8542 IF g_debug_flag THEN
8543 Write_Debug('Calling Eng_Change_Route_People_Util.UPDATE_ROW - Route People Id: ' || l_route_people_id ) ;
8544 END IF ;
8545
8546 Eng_Change_Route_People_Util.UPDATE_ROW
8547 ( X_ROUTE_PEOPLE_ID => l_route_people_id ,
8548 X_REQUEST_ID => null ,
8549 X_ORIGINAL_SYSTEM_REFERENCE => null ,
8550 X_ASSIGNEE_ID => l_performer_party_id ,
8551 X_RESPONSE_DATE => SYSDATE ,
8552 X_STEP_ID => l_step_id,
8553 X_ASSIGNEE_TYPE_CODE => l_assignee_type_code,
8554 X_ADHOC_PEOPLE_FLAG => l_adhoc_people_flag,
8555 X_WF_NOTIFICATION_ID => p_notification_id,
8556 X_RESPONSE_CODE => p_response_code,
8557 X_RESPONSE_DESCRIPTION => l_comment ,
8558 X_LAST_UPDATE_DATE => SYSDATE ,
8559 X_LAST_UPDATED_BY => l_performer_user_id ,
8560 X_LAST_UPDATE_LOGIN => null,
8561 X_PROGRAM_ID => null,
8562 X_PROGRAM_APPLICATION_ID => null ,
8563 X_PROGRAM_UPDATE_DATE => null ,
8564 X_ORIGINAL_ASSIGNEE_ID => l_original_assignee_id ,
8565 X_ORIGINAL_ASSIGNEE_TYPE_CODE => l_original_assignee_type_code ,
8566 X_RESPONSE_CONDITION_CODE => l_response_condition_code
8567 ) ;
8568 */
8569
8570 update ENG_CHANGE_ROUTE_PEOPLE set
8571 WF_NOTIFICATION_ID = p_notification_id,
8572 RESPONSE_CODE = p_response_code ,
8573 RESPONSE_DATE = SYSDATE ,
8574 LAST_UPDATE_DATE = SYSDATE ,
8575 LAST_UPDATED_BY = l_performer_user_id ,
8576 LAST_UPDATE_LOGIN = null
8577 where ROUTE_PEOPLE_ID = l_route_people_id ;
8578
8579 update ENG_CHANGE_ROUTE_PEOPLE_TL set
8580 RESPONSE_DESCRIPTION = l_comment,
8581 LAST_UPDATE_DATE = SYSDATE ,
8582 LAST_UPDATED_BY = l_performer_user_id ,
8583 LAST_UPDATE_LOGIN = null ,
8584 SOURCE_LANG = userenv('LANG')
8585 where ROUTE_PEOPLE_ID = l_route_people_id ;
8586
8587
8588 END LOOP ;
8589
8590
8591 -- In case that Route Object is Change Object
8592 IF l_change_id IS NOT NULL AND l_change_id > 0
8593 THEN
8594
8595 l_action_type := Eng_Workflow_Util.ConvertRouteStatusToActionType
8596 ( p_route_status_code => p_response_code
8597 , p_convert_type => 'RESPONSE' ) ;
8598
8599 -- Record Action
8600 Eng_Workflow_Util.CreateAction
8601 ( x_return_status => l_return_status
8602 , x_msg_count => l_msg_count
8603 , x_msg_data => l_msg_data
8604 , p_item_type => p_item_type
8605 , p_item_key => p_item_key
8606 , p_notification_id => p_notification_id
8607 , p_action_type => l_action_type
8608 , x_action_id => l_created_action_id
8609 ) ;
8610
8611 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8612
8613 x_return_status := l_return_status ;
8614 x_msg_count := l_msg_count ;
8615 x_msg_data := l_msg_data ;
8616 END IF ;
8617
8618 END IF ; -- changeId is not null
8619
8620
8621 -- Added in 115.10E
8622 -- To support closing duplicate ntf for same assignee, which is
8623 -- inserted by Ntf Reassignement etc
8624 FOR dup_ntf_rec IN c_duplicate_ntf ( p_item_type => p_item_type
8625 , p_item_key => p_item_key
8626 , p_orig_ntf_id => p_notification_id )
8627 LOOP
8628
8629 IF g_debug_flag THEN
8630 Write_Debug('Duplicate Ntf Exists and call RespondToDuplicateNtf: ' || dup_ntf_rec.NOTIFICATION_ID ) ;
8631 END IF ;
8632
8633
8634 begin
8635
8636 -- Check Notifiation Result to make sure
8637 -- this notifiaction has not been responded
8638 -- WF Code has cache mechanism
8639 -- So just querying table is not enough
8640 l_result := WF_NOTIFICATION.GetAttrText(nid => dup_ntf_rec.notification_id
8641 ,aname => 'RESULT' ) ;
8642
8643 IF g_debug_flag THEN
8644 Write_Debug('Duplicate Ntf Result : ' || l_result ) ;
8645 END IF ;
8646 IF l_result IS NULL THEN
8647
8648 IF g_debug_flag THEN
8649 Write_Debug('Result is null and call RespondToDuplicateNtf: ' || dup_ntf_rec.NOTIFICATION_ID ) ;
8650 END IF ;
8651
8652 Eng_Workflow_Util.RespondToDuplicateNtf( p_dupllicate_ntf_id => dup_ntf_rec.notification_id
8653 , p_orig_ntf_id => p_notification_id
8654 , p_responder => dup_ntf_rec.RECIPIENT_ROLE
8655 ) ;
8656 END IF ;
8657
8658 exception
8659 when others then
8660 -- The exception may be thrown for Digisig Enabled Ntf
8661 -- Ignore this
8662 -- The user has to respond to each ntf in that case
8663 IF g_debug_flag THEN
8664 Write_Debug('RespondToDuplicateNtf Exception: ' || SQLERRM ) ;
8665 END IF ;
8666
8667 end ;
8668
8669 END LOOP ; -- duplicate_ntf loop
8670
8671
8672 --
8673 -- R12B Modified to support AUTO_REVOKE_RESPONSE NTF Attribute
8674 -- If the response is the value specified in AUTO_REVOKE_RESPONSE NTF Attribute
8675 -- we will revoke roles on this wf assignee
8676 -- Record Route Response
8677 IF ( p_funcmode = 'RESPOND'
8678 AND ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_STEP_ITEM_TYPE
8679 OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE
8680 OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE
8681 )
8682 )
8683 THEN
8684
8685 IF g_debug_flag THEN
8686 Write_Debug('Getting AUTO_REVOKE_RESPONSE NTF Attribute . . . ' ) ;
8687 END IF ;
8688
8689 -- R12B
8690 -- Need to revoke auto grant if the response is DECLIEND.
8691 l_auto_revoke_resp := WF_ENGINE.GetActivityAttrText
8692 ( p_item_type
8693 , p_item_key
8694 , p_actid
8695 , G_ATTR_AUTO_REVOKE_RESPONSE -- aname
8696 , TRUE -- ignore_notfound
8697 ) ;
8698
8699
8700 IF g_debug_flag THEN
8701 Write_Debug('AUTO_REVOKE_RESPONSE NTF Attribute : ' || l_auto_revoke_resp ) ;
8702 END IF ;
8703
8704 IF ( l_auto_revoke_resp IS NOT NULL AND p_response_code = l_auto_revoke_resp )
8705 THEN
8706
8707 l_obj_index := 0 ;
8708 l_person_idx := 0 ;
8709 IF ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE )
8710 THEN
8711 l_obj_index := l_obj_index + 1 ;
8712 l_target_obj_tbl.EXTEND ;
8713 l_target_obj_tbl(l_obj_index) := G_DOM_DOCUMENT_REVISION ;
8714 END IF ;
8715
8716
8717 l_person_id_tbl.EXTEND ;
8718 l_person_id_tbl(l_person_idx + 1) := l_performer_party_id ;
8719
8720
8721 IF g_debug_flag THEN
8722 Write_Debug('Calling Eng_Workflow_Util.RevokeObjectRoles for this assignee: ' || l_performer_party_id );
8723 END IF ;
8724
8725
8726 Eng_Workflow_Util.RevokeObjectRoles
8727 ( p_api_version => 1.0
8728 , p_init_msg_list => FND_API.G_FALSE --
8729 , p_commit => FND_API.G_FALSE --
8730 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
8731 , p_debug => FND_API.G_FALSE
8732 , p_output_dir => NULL
8733 , p_debug_filename => NULL
8734 , x_return_status => l_return_status
8735 , x_msg_count => l_msg_count
8736 , x_msg_data => l_msg_data
8737 , p_change_id => l_change_id
8738 , p_change_line_id => l_change_line_id
8739 , p_route_id => l_route_id
8740 , p_step_id => l_step_id
8741 , p_person_ids => l_person_id_tbl
8742 , p_target_objects => l_target_obj_tbl
8743 , p_api_caller => G_WF_CALL
8744 , p_revoke_option => NULL
8745 ) ;
8746
8747 IF g_debug_flag THEN
8748 Write_Debug('After Eng_Workflow_Util.RevokeObjectRoles.' || l_return_status );
8749 END IF ;
8750
8751 --
8752 -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
8753 -- THEN
8754 -- RAISE FND_API.G_EXC_ERROR ;
8755 -- END IF ;
8756
8757 END IF ; -- ( l_auto_revoke_resp IS NOT NULL AND p_response_code = l_auto_revoke_resp )
8758
8759
8760 END IF ;
8761
8762
8763 EXCEPTION
8764 WHEN OTHERS THEN
8765
8766 IF g_debug_flag THEN
8767 Write_Debug('Eng_Workflow_Util.SetRouteResponse Unxexpected Error.' || SQLERRM);
8768 END IF ;
8769
8770 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
8771
8772 IF FND_MSG_PUB.Check_Msg_Level
8773 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
8774 THEN
8775 FND_MSG_PUB.Add_Exc_Msg
8776 ( G_PKG_NAME
8777 , l_api_name
8778 );
8779 END IF;
8780
8781 -- Bug 12667853 start
8782 IF ( l_base_change_mgmt_type_code = 'NEW_ITEM_REQUEST' and wf_core.error_name = 'WFENG_NOTIFICATION_FUNCTION' )
8783 THEN
8784 raise;
8785 END IF;
8786 -- Bug 12667853 end
8787
8788 END SetRouteResponse ;
8789
8790
8791
8792
8793
8794 PROCEDURE FindNextRouteStep
8795 ( x_return_status OUT NOCOPY VARCHAR2
8796 , x_msg_count OUT NOCOPY NUMBER
8797 , x_msg_data OUT NOCOPY VARCHAR2
8798 , p_route_id IN NUMBER
8799 , x_step_id OUT NOCOPY NUMBER
8800 , x_step_item_type OUT NOCOPY VARCHAR2
8801 , x_step_process_name OUT NOCOPY VARCHAR2
8802 )
8803 IS
8804
8805 l_api_name CONSTANT VARCHAR2(30) := 'FindNextRouteStep';
8806
8807 CURSOR c_next_step (p_route_id NUMBER)
8808 IS
8809 SELECT step_id,
8810 step_seq_num,
8811 wf_item_type,
8812 wf_process_name
8813 FROM ENG_CHANGE_ROUTE_STEPS
8814 WHERE route_id = p_route_id
8815 AND step_status_code = Eng_Workflow_Util.G_RT_NOT_STARTED
8816 AND step_start_date IS NULL
8817 AND step_end_date IS NULL
8818 ORDER BY 2 ASC ;
8819
8820 recinfo c_next_step%rowtype;
8821
8822
8823 BEGIN
8824
8825 -- Initialize API return status to success
8826 x_return_status := FND_API.G_RET_STS_SUCCESS;
8827
8828
8829 OPEN c_next_step(p_route_id => p_route_id) ;
8830 FETCH c_next_step into recinfo;
8831 IF (c_next_step%notfound) THEN
8832 CLOSE c_next_step ;
8833
8834 END IF;
8835
8836 IF c_next_step%ISOPEN THEN
8837 CLOSE c_next_step ;
8838 END IF ;
8839
8840 x_step_id := recinfo.step_id ;
8841 x_step_item_type := recinfo.wf_item_type ;
8842 x_step_process_name := recinfo.wf_process_name ;
8843
8844
8845
8846
8847 EXCEPTION
8848 WHEN OTHERS THEN
8849
8850 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
8851
8852 IF FND_MSG_PUB.Check_Msg_Level
8853 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
8854 THEN
8855 FND_MSG_PUB.Add_Exc_Msg
8856 ( G_PKG_NAME
8857 , l_api_name
8858 );
8859 END IF;
8860
8861 END FindNextRouteStep ;
8862
8863
8864 PROCEDURE StartNextRouteStep
8865 ( x_return_status OUT NOCOPY VARCHAR2
8866 , x_msg_count OUT NOCOPY NUMBER
8867 , x_msg_data OUT NOCOPY VARCHAR2
8868 , p_route_item_type IN VARCHAR2
8869 , p_route_item_key IN VARCHAR2
8870 , p_route_id IN NUMBER
8871 , p_change_id IN NUMBER := NULL
8872 , p_change_line_id IN NUMBER := NULL
8873 , p_wf_user_id IN NUMBER
8874 , p_host_url IN VARCHAR2
8875 , x_step_id OUT NOCOPY NUMBER
8876 , x_step_item_type OUT NOCOPY VARCHAR2
8877 , x_step_item_key OUT NOCOPY VARCHAR2
8878 , p_object_name IN VARCHAR2 := NULL
8879 , p_object_id1 IN NUMBER := NULL
8880 , p_object_id2 IN NUMBER := NULL
8881 , p_object_id3 IN NUMBER := NULL
8882 , p_object_id4 IN NUMBER := NULL
8883 , p_object_id5 IN NUMBER := NULL
8884 , p_parent_object_name IN VARCHAR2 := NULL
8885 , p_parent_object_id1 IN NUMBER := NULL
8886 , p_route_action_id IN NUMBER := NULL
8887 )
8888 IS
8889
8890 -- PRAGMA AUTONOMOUS_TRANSACTION;
8891 l_api_name CONSTANT VARCHAR2(30) := 'StartNextRouteStep';
8892
8893 l_step_process_name VARCHAR2(30) ;
8894 -- l_change_id NUMBER ;
8895 -- l_change_notice VARCHAR2(10) ;
8896 -- l_organization_id NUMBER ;
8897 -- l_wf_user_id NUMBER ;
8898 -- l_host_url VARCHAR2(256) ;
8899 l_debug VARCHAR2(1) := FND_API.G_FALSE ;
8900 l_output_dir VARCHAR2(240) := NULL ;
8901 l_debug_filename VARCHAR2(200) := 'StartNextRouteStep.log' ;
8902
8903
8904 BEGIN
8905
8906 IF g_debug_flag THEN
8907 Write_Debug('Eng_Workflow_Util.StartNextRouteStep Log');
8908 Write_Debug('-----------------------------------------------------');
8909 Write_Debug('Route Item Type : ' || p_route_item_type );
8910 Write_Debug('Route Item Key : ' || p_route_item_key );
8911 Write_Debug('Route Id : ' || TO_CHAR(p_route_id) );
8912 Write_Debug('Change Id : ' || TO_CHAR(p_change_id) );
8913 Write_Debug('Change Line Id : ' || TO_CHAR(p_change_line_id) );
8914 Write_Debug('-----------------------------------------------------');
8915 END IF ;
8916
8917 -- Initialize API return status to success
8918 x_return_status := FND_API.G_RET_STS_SUCCESS;
8919
8920 --
8921 -- Don't try to get Parent Item Attributes from this procedure
8922 -- because this proc is setting PRAGMA AUTONOMOUS_TRANSACTION
8923 -- If the user modify the Cost info to '0' in Worklfow Definition,
8924 -- the process can not get the Item Attributes because the parent item
8925 -- attr is not saved yet and here is in different session
8926 --
8927
8928 -- Get Next Route Step Info
8929 FindNextRouteStep
8930 ( x_return_status => x_return_status
8931 , x_msg_count => x_msg_count
8932 , x_msg_data => x_msg_data
8933 , p_route_id => p_route_id
8934 , x_step_id => x_step_id
8935 , x_step_item_type => x_step_item_type
8936 , x_step_process_name => l_step_process_name
8937 ) ;
8938
8939
8940 IF x_step_id IS NULL THEN
8941
8942 x_return_status := Eng_Workflow_Util.G_RET_STS_NONE ;
8943 RETURN ;
8944
8945 END IF ;
8946
8947
8948 -- FND_MSG_PUB.initialize ;
8949 Eng_Workflow_Util.StartWorkflow
8950 ( p_api_version => 1.0
8951 , p_init_msg_list => FND_API.G_FALSE
8952 , p_commit => FND_API.G_FALSE
8953 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
8954 , x_return_status => x_return_status
8955 , x_msg_count => x_msg_count
8956 , x_msg_data => x_msg_data
8957 , p_item_type => x_step_item_type
8958 , x_item_key => x_step_item_key
8959 , p_process_name => l_step_process_name
8960 , p_change_id => p_change_id
8961 , p_change_line_id => p_change_line_id
8962 , p_wf_user_id => p_wf_user_id
8963 , p_host_url => p_host_url
8964 , p_route_id => p_route_id
8965 , p_route_step_id => x_step_id
8966 , p_parent_item_type => p_route_item_type
8967 , p_parent_item_key => p_route_item_key
8968 , p_action_id => p_route_action_id
8969 , p_debug => l_debug
8970 , p_output_dir => l_output_dir
8971 , p_debug_filename => l_debug_filename
8972 ) ;
8973
8974 IF x_return_status = FND_API.G_RET_STS_SUCCESS
8975 THEN
8976
8977 -- COMMENT OUT PRAGMA AUTONOMOUS_TRANSACTION
8978 -- COMMIT ;
8979 NULL ;
8980
8981 ELSE
8982
8983 -- COMMENT OUT PRAGMA AUTONOMOUS_TRANSACTION
8984 -- ROLLBACK ;
8985 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8986
8987 END IF ;
8988
8989 IF g_debug_flag THEN
8990 Write_Debug('After call Eng_Workflow_Util.StartWorkflow' ) ;
8991 Write_Debug('Return Status: ' || x_return_status ) ;
8992 Write_Debug('Return Message: ' || x_msg_data ) ;
8993 Write_Debug('Started Step Id : ' || x_step_id ) ;
8994 Write_Debug('Started Step WF Item Type: ' || x_step_item_type ) ;
8995 Write_Debug('Started Step WF Item Kye: ' || x_step_item_key ) ;
8996 Write_Debug('Started Step WF Process Name: ' || l_step_process_name ) ;
8997 END IF ;
8998
8999
9000 EXCEPTION
9001 WHEN OTHERS THEN
9002
9003 -- ROLLBACK ;
9004
9005 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9006
9007 IF FND_MSG_PUB.Check_Msg_Level
9008 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9009 THEN
9010 FND_MSG_PUB.Add_Exc_Msg
9011 ( G_PKG_NAME
9012 , l_api_name
9013 );
9014 END IF;
9015
9016 END StartNextRouteStep ;
9017
9018
9019 PROCEDURE AbortRouteSteps
9020 ( x_return_status OUT NOCOPY VARCHAR2
9021 , x_msg_count OUT NOCOPY NUMBER
9022 , x_msg_data OUT NOCOPY VARCHAR2
9023 , p_route_item_type IN VARCHAR2
9024 , p_route_item_key IN VARCHAR2
9025 , p_wf_user_id IN NUMBER
9026 )
9027 IS
9028 l_api_name CONSTANT VARCHAR2(30) := 'AbortRouteSteps';
9029
9030 l_msg_count NUMBER ;
9031 l_msg_data VARCHAR2(2000) ;
9032 l_return_status VARCHAR2(1) ;
9033
9034 l_debug VARCHAR2(1) := FND_API.G_FALSE ;
9035 l_output_dir VARCHAR2(240) := NULL ;
9036 l_debug_filename VARCHAR2(200) := 'AbortRouteSteps.log' ;
9037
9038
9039 CURSOR c_abort_step ( p_route_item_type VARCHAR2
9040 , p_route_item_key VARCHAR2 )
9041 IS
9042
9043 SELECT wi.item_type wf_item_type
9044 , wi.item_key wf_item_key
9045 , wi.root_activity wf_process_name
9046 FROM WF_ITEMS wi
9047 WHERE wi.parent_item_type = p_route_item_type
9048 AND wi.parent_item_key = p_route_item_key
9049 AND wi.item_type IN ( Eng_Workflow_Util.G_CHANGE_ROUTE_STEP_ITEM_TYPE
9050 , Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE
9051 , Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE )
9052 AND wi.end_date IS NULL ;
9053
9054 BEGIN
9055
9056 IF g_debug_flag THEN
9057 Write_Debug('Eng_Workflow_Util.AbortRouteStepsLog');
9058 Write_Debug('-----------------------------------------------------');
9059 Write_Debug('Route Item Type : ' || p_route_item_type );
9060 Write_Debug('Route Item Key : ' || p_route_item_key );
9061 Write_Debug('-----------------------------------------------------');
9062 END IF ;
9063
9064 -- Initialize API return status to success
9065 x_return_status := FND_API.G_RET_STS_SUCCESS;
9066
9067 FOR abort_step_rec IN c_abort_step ( p_route_item_type => p_route_item_type
9068 , p_route_item_key => p_route_item_key )
9069 LOOP
9070
9071
9072 IF g_debug_flag THEN
9073 Write_Debug('Aborting Route Step Worklfow . . . ') ;
9074 Write_Debug('Step Item Type : ' || abort_step_rec.wf_item_type);
9075 Write_Debug('Step Item Key : ' || abort_step_rec.wf_item_key);
9076 END IF ;
9077
9078
9079 Eng_Workflow_Util.AbortWorkflow
9080 ( p_api_version => 1.0
9081 , p_init_msg_list => FND_API.G_FALSE
9082 , p_commit => FND_API.G_FALSE
9083 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
9084 , x_return_status => l_return_status
9085 , x_msg_count => l_msg_count
9086 , x_msg_data => l_msg_data
9087 , p_item_type => abort_step_rec.wf_item_type
9088 , p_item_key => abort_step_rec.wf_item_key
9089 , p_process_name => abort_step_rec.wf_process_name
9090 , p_wf_user_id => p_wf_user_id
9091 , p_debug => l_debug
9092 , p_output_dir => l_output_dir
9093 , p_debug_filename => l_debug_filename
9094 ) ;
9095
9096
9097 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS )
9098 THEN
9099
9100 x_return_status := l_return_status ;
9101 x_msg_count := NVL(l_msg_count, 0) + NVL(l_msg_count,0) ;
9102 x_msg_data := l_msg_data ;
9103
9104 END IF ;
9105
9106 END LOOP ;
9107
9108 IF g_debug_flag THEN
9109 Write_Debug('After call Eng_Workflow_Util.AbortWorkflow' ) ;
9110 Write_Debug('Return Status: ' || x_return_status ) ;
9111 Write_Debug('Return Message: ' || x_msg_data ) ;
9112 END IF ;
9113
9114
9115 EXCEPTION
9116 WHEN OTHERS THEN
9117
9118 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9119
9120 IF FND_MSG_PUB.Check_Msg_Level
9121 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9122 THEN
9123 FND_MSG_PUB.Add_Exc_Msg
9124 ( G_PKG_NAME
9125 , l_api_name
9126 );
9127 END IF;
9128
9129 END AbortRouteSteps ;
9130
9131
9132
9133 PROCEDURE GrantChangeRoleToParty
9134 ( x_return_status OUT NOCOPY VARCHAR2
9135 , x_msg_count OUT NOCOPY NUMBER
9136 , x_msg_data OUT NOCOPY VARCHAR2
9137 , p_role_name IN VARCHAR2
9138 , p_change_id IN NUMBER
9139 , p_party_id IN NUMBER
9140 , p_start_date IN DATE
9141 , p_end_date IN DATE := NULL
9142 )
9143 IS
9144
9145 l_api_name CONSTANT VARCHAR2(30) := 'GrantChangeRoleToParty';
9146
9147 l_grant_guid FND_GRANTS.GRANT_GUID%TYPE ;
9148 l_return_status VARCHAR2(3) ;
9149
9150
9151 BEGIN
9152
9153 -- Initialize API return status to success
9154 x_return_status := FND_API.G_RET_STS_SUCCESS;
9155
9156
9157
9158 EGO_SECURITY_PUB.grant_role_guid
9159 ( p_api_version => 1.0 ,
9160 p_role_name => p_role_name ,
9161 p_object_name => GetChangeObjectName(p_change_id) ,
9162 p_instance_type => 'INSTANCE' ,
9163 p_instance_set_id => NULL ,
9164 p_instance_pk1_value => TO_CHAR(p_change_id) ,
9165 p_instance_pk2_value => NULL ,
9166 p_instance_pk3_value => NULL ,
9167 p_instance_pk4_value => NULL ,
9168 p_instance_pk5_value => NULL ,
9169 p_party_id => p_party_id ,
9170 p_start_date => NVL(p_start_date,SYSDATE) ,
9171 p_end_date => p_end_date ,
9172 x_return_status => l_return_status ,
9173 x_errorcode => x_msg_data ,
9174 x_grant_guid => l_grant_guid
9175 );
9176
9177
9178 --
9179 -- EGO Security pub returns T if the action is success
9180 -- and F on failure
9181 --
9182 IF ( l_return_status = FND_API.G_TRUE OR
9183 l_return_status = FND_API.G_FALSE )
9184 THEN
9185
9186 x_return_status := FND_API.G_RET_STS_SUCCESS;
9187
9188 ELSE
9189
9190 x_return_status := FND_API.G_RET_STS_ERROR ;
9191
9192 END IF ;
9193
9194
9195 EXCEPTION
9196 WHEN OTHERS THEN
9197
9198 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9199
9200 IF FND_MSG_PUB.Check_Msg_Level
9201 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9202 THEN
9203 FND_MSG_PUB.Add_Exc_Msg
9204 ( G_PKG_NAME
9205 , l_api_name
9206 );
9207 END IF;
9208
9209 END GrantChangeRoleToParty ;
9210
9211
9212 PROCEDURE StartLineRoutes
9213 ( x_return_status OUT NOCOPY VARCHAR2
9214 , x_msg_count OUT NOCOPY NUMBER
9215 , x_msg_data OUT NOCOPY VARCHAR2
9216 , p_item_type IN VARCHAR2
9217 , p_item_key IN VARCHAR2
9218 , p_change_id IN NUMBER
9219 , p_wf_user_id IN NUMBER
9220 , p_host_url IN VARCHAR2 := NULL
9221 )
9222 IS
9223
9224 PRAGMA AUTONOMOUS_TRANSACTION;
9225 l_api_name CONSTANT VARCHAR2(30) := 'StartLineRoutes';
9226
9227 l_return_status VARCHAR2(1) ;
9228 l_line_item_key VARCHAR2(240) ;
9229 l_change_id NUMBER ;
9230
9231 l_debug VARCHAR2(1) := FND_API.G_FALSE ;
9232 l_output_dir VARCHAR2(240) := '' ;
9233 l_debug_filename VARCHAR2(200) := 'StartLineRoutes.log' ;
9234
9235
9236 -- Targe Change Line Route
9237 -- Change Line Object
9238 -- Approval Status: NOT Approved and Approva Requested
9239 -- Status: Not Cancelled or Completed
9240 -- Main Line
9241 -- Not Header Line
9242 -- Line Route: NOT_STARTED or throw exception from StartWorkflow API
9243 -- At least, we should refres route at OA Page level
9244 CURSOR c_lines (p_change_id NUMBER)
9245 IS
9246 SELECT ecl.change_line_id
9247 , ecl.route_id
9248 , ecr.wf_item_type
9249 , ecr.wf_process_name
9250 FROM ENG_CHANGE_LINES ecl
9251 , ENG_CHANGE_ROUTES ecr
9252 WHERE ( ecl.status_code <> Eng_Workflow_Util.G_CL_COMPLETED
9253 AND ecl.status_code <> Eng_Workflow_Util.G_CL_CANCELLED )
9254 AND ( ecl.approval_status_type <> Eng_Workflow_Util.G_APPROVED
9255 AND ecl.approval_status_type <> Eng_Workflow_Util.G_REQUESTED )
9256 AND ecl.sequence_number <> -1
9257 -- AND ecl.parent_line_id IS NULL
9258 -- AND ecr.status_code = Eng_Workflow_Util.G_RT_NOT_STARTED
9259 AND ecl.change_type_id <> -1
9260 AND ecl.route_id = ecr.route_id
9261 AND ecl.change_id = p_change_id ;
9262
9263
9264 BEGIN
9265
9266 IF g_debug_flag THEN
9267 Write_Debug('Eng_Workflow_Util.StartLineRoutes');
9268 Write_Debug('-----------------------------------------------------');
9269 Write_Debug('Item Type : ' || p_item_type );
9270 Write_Debug('Item Key : ' || p_item_key );
9271 Write_Debug('Change Id : ' || TO_CHAR(p_change_id) );
9272 Write_Debug('-----------------------------------------------------');
9273 END IF ;
9274
9275 -- Initialize API return status to None:N
9276 l_return_status := Eng_Workflow_Util.G_RET_STS_NONE ;
9277 x_return_status := Eng_Workflow_Util.G_RET_STS_NONE ;
9278
9279 --
9280 -- Don't try to get Parent Item Attributes from this procedure
9281 -- because this proc is setting PRAGMA AUTONOMOUS_TRANSACTION
9282 -- If the user modify the Cost info to '0' in Worklfow Definition,
9283 -- the process can not get the Item Attributes because the parent item
9284 -- attr is not saved yet and here is in different session
9285 --
9286
9287 -- Get Change Lines
9288 FOR line_rec IN c_lines (p_change_id => p_change_id)
9289 LOOP
9290
9291 -- Initialize Line Item Key
9292 l_line_item_key := null ;
9293
9294 -- Start Change Line Workflows
9295 -- FND_MSG_PUB.initialize ;
9296 Eng_Workflow_Util.StartWorkflow
9297 ( p_api_version => 1.0
9298 , p_init_msg_list => FND_API.G_FALSE
9299 , p_commit => FND_API.G_FALSE
9300 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
9301 , x_return_status => l_return_status
9302 , x_msg_count => x_msg_count
9303 , x_msg_data => x_msg_data
9304 , p_item_type => line_rec.wf_item_type
9305 , x_item_key => l_line_item_key
9306 , p_process_name => line_rec.wf_process_name
9307 , p_change_line_id => line_rec.change_line_id
9308 , p_wf_user_id => p_wf_user_id
9309 , p_host_url => p_host_url
9310 , p_parent_item_type => p_item_type
9311 , p_parent_item_key => p_item_key
9312 , p_debug => l_debug
9313 , p_output_dir => l_output_dir
9314 , p_debug_filename => l_debug_filename || TO_CHAR(line_rec.change_line_id)
9315 ) ;
9316
9317 IF l_return_status <> FND_API.G_RET_STS_SUCCESS
9318 THEN
9319
9320 x_return_status := l_return_status ;
9321
9322 END IF ;
9323
9324 IF g_debug_flag THEN
9325 Write_Debug('After call Eng_Workflow_Util.StartWorkflow' ) ;
9326 Write_Debug('Return Status: ' || l_return_status ) ;
9327 Write_Debug('Return Message: ' || x_msg_data ) ;
9328 Write_Debug('Started Change Line Id : ' || TO_CHAR(line_rec.change_line_id) ) ;
9329 Write_Debug('Started CL WF Item Type: ' || line_rec.wf_item_type) ;
9330 Write_Debug('Started CL WF Item Kye: ' || l_line_item_key ) ;
9331 Write_Debug('Started CL WF Process Name: ' || line_rec.wf_process_name ) ;
9332 END IF ;
9333
9334
9335 END LOOP ;
9336
9337
9338
9339 IF x_return_status = FND_API.G_RET_STS_SUCCESS
9340 OR x_return_status = Eng_Workflow_Util.G_RET_STS_NONE
9341 THEN
9342
9343 COMMIT ;
9344
9345 ELSE
9346
9347 ROLLBACK ;
9348 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
9349
9350 END IF ;
9351
9352
9353 EXCEPTION
9354 WHEN OTHERS THEN
9355
9356 ROLLBACK ;
9357
9358 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9359
9360 IF FND_MSG_PUB.Check_Msg_Level
9361 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9362 THEN
9363 FND_MSG_PUB.Add_Exc_Msg
9364 ( G_PKG_NAME
9365 , l_api_name
9366 );
9367 END IF;
9368
9369 END StartLineRoutes ;
9370
9371 PROCEDURE CheckAllLineApproved
9372 ( x_return_status OUT NOCOPY VARCHAR2
9373 , x_msg_count OUT NOCOPY NUMBER
9374 , x_msg_data OUT NOCOPY VARCHAR2
9375 , p_change_id IN NUMBER
9376 , x_line_approval_status OUT NOCOPY NUMBER
9377 )
9378 IS
9379
9380 l_api_name CONSTANT VARCHAR2(30) := 'CheckAllLineApproved';
9381
9382 -- Targe Change Line Route
9383 -- Change Line Object
9384 -- Status: 'OPEN'
9385 -- Main Line
9386 -- Not Header Line
9387 -- Line Route: Exists
9388 CURSOR c_approved_line (p_change_id NUMBER )
9389 IS
9390 SELECT 'Non Approved Line Exists'
9391 FROM DUAL
9392 WHERE EXISTS ( SELECT null
9393 FROM ENG_CHANGE_LINES ecl
9394 WHERE ( ecl.status_code <> Eng_Workflow_Util.G_CL_COMPLETED
9395 AND ecl.status_code <> Eng_Workflow_Util.G_CL_CANCELLED )
9396 AND ecl.approval_status_type <> Eng_Workflow_Util.G_APPROVED
9397 AND ecl.change_type_id <> -1
9398 AND ecl.sequence_number <> -1
9399 -- AND ecl.parent_line_id IS NULL
9400 AND ecl.route_id IS NOT NULL
9401 AND ecl.change_id = p_change_id
9402 ) ;
9403
9404
9405 BEGIN
9406
9407 -- Initialize API return status to success
9408 x_return_status := FND_API.G_RET_STS_SUCCESS;
9409
9410 x_line_approval_status := Eng_Workflow_Util.G_APPROVED ;
9411
9412 FOR l_approved_line_rec IN c_approved_line (p_change_id )
9413 LOOP
9414
9415 x_line_approval_status := Eng_Workflow_Util.G_REQUESTED ;
9416
9417 END LOOP ;
9418
9419
9420 EXCEPTION
9421 WHEN OTHERS THEN
9422
9423 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9424
9425 IF FND_MSG_PUB.Check_Msg_Level
9426 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9427 THEN
9428 FND_MSG_PUB.Add_Exc_Msg
9429 ( G_PKG_NAME
9430 , l_api_name
9431 );
9432 END IF;
9433
9434 END CheckAllLineApproved ;
9435
9436
9437
9438 FUNCTION GetFunctionWebHTMLCall (p_function_name IN VARCHAR2)
9439 RETURN VARCHAR2
9440 IS
9441
9442 l_web_html_call VARCHAR2(240) ;
9443
9444 c1_OAHP PLS_INTEGER ;
9445 c2_OAHP PLS_INTEGER ;
9446 OAHP_param VARCHAR2(100) ;
9447 c1_OASF PLS_INTEGER ;
9448 c2_OASF PLS_INTEGER ;
9449 OASF_param VARCHAR2(100) ;
9450
9451 CURSOR c_func ( p_function_name VARCHAR2)
9452 IS
9453
9454 SELECT web_html_call
9455 FROM FND_FORM_FUNCTIONS
9456 WHERE function_name = p_function_name ;
9457
9458 BEGIN
9459
9460 FOR func_rec IN c_func (p_function_name)
9461 LOOP
9462
9463 l_web_html_call := func_rec.web_html_call;
9464
9465 END LOOP ;
9466
9467 /*
9468 -- No need to remove OAHP and OASF
9469 -- Comment Out:
9470 -- Remvoed OAHP Param from web_html_call
9471 -- Otherwise OAFrameWork throws NPE
9472 c1_OAHP := INSTR(l_web_html_call, '&OAHP' ) ;
9473 IF ( c1_OAHP <> 0 ) THEN
9474 c2_OAHP := INSTR(l_web_html_call, '&', c1_OAHP + 1 ) ;
9475
9476 IF (c2_OAHP = 0) THEN
9477 c2_OAHP := LENGTH(l_web_html_call) + 1 ;
9478 END IF ;
9479
9480 OAHP_param := SUBSTR( l_web_html_call, c1_OAHP, (c2_OAHP - c1_OAHP)) ;
9481
9482 l_web_html_call := REPLACE(l_web_html_call, OAHP_param , '') ;
9483
9484 END IF ;
9485
9486 c1_OASF := INSTR(l_web_html_call, '&OASF' ) ;
9487
9488 IF ( c1_OASF <> 0 ) THEN
9489 c2_OASF := INSTR(l_web_html_call, '&', c1_OASF + 1 ) ;
9490
9491 IF (c2_OASF = 0) THEN
9492
9493 c2_OASF := LENGTH(l_web_html_call) + 1 ;
9494
9495 END IF ;
9496
9497 OASF_param := SUBSTR( l_web_html_call, c1_OASF, (c2_OASF - c1_OASF)) ;
9498
9499 l_web_html_call := REPLACE(l_web_html_call, OASF_param , '') ;
9500
9501 END IF ;
9502 */
9503
9504 RETURN l_web_html_call ;
9505
9506
9507 END GetFunctionWebHTMLCall;
9508
9509
9510
9511 -- OBSOLETE
9512 -- NOT USED
9513 -- Called from Eng_Workflow_Pub.GRANT_ROLE_TO_STEP_PEOPLE
9514 -- Moved to instance set grant approach
9515 PROCEDURE GrantChangeRoleToStepPeople
9516 ( x_return_status OUT NOCOPY VARCHAR2
9517 , x_msg_count OUT NOCOPY NUMBER
9518 , x_msg_data OUT NOCOPY VARCHAR2
9519 , p_item_type IN VARCHAR2
9520 , p_item_key IN VARCHAR2
9521 , p_change_id IN NUMBER
9522 , p_step_id IN NUMBER
9523 )
9524 IS
9525
9526 l_api_name CONSTANT VARCHAR2(30) := 'GrantChangeRoleToStepPeople';
9527
9528 l_msg_count NUMBER ;
9529 l_msg_data VARCHAR2(2000) ;
9530 l_return_status VARCHAR2(1) ;
9531
9532
9533 l_assignee_id NUMBER ;
9534 l_assignee_type_code VARCHAR2(30);
9535 l_adhoc_people_flag VARCHAR2(1) ;
9536 l_default_role_name VARCHAR2(30);
9537 l_activity_condition_code VARCHAR2(30);
9538 l_performer_party_id NUMBER;
9539
9540
9541
9542 CURSOR c_route_person ( p_step_id NUMBER
9543 , p_assignee_type_code VARCHAR2 )
9544 IS
9545
9546 SELECT RoutePeople.assignee_id
9547 , RoutePeople.adhoc_people_flag
9548 FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
9549 WHERE RoutePeople.assignee_type_code = p_assignee_type_code
9550 AND RoutePeople.assignee_id <> -1
9551 AND RoutePeople.step_id = p_step_id ;
9552
9553 BEGIN
9554
9555 -- Initialize API return status to success
9556 x_return_status := FND_API.G_RET_STS_SUCCESS;
9557
9558
9559 -- Get Step Activity Attributes
9560 GetStepActAttributes
9561 ( p_step_id => p_step_id
9562 , x_default_role_name => l_default_role_name
9563 , x_activity_condition_code => l_activity_condition_code ) ;
9564
9565
9566 -- In this reslease assignee type is only 'PERSON' for Worklfow Routing Instance
9567 l_assignee_type_code := 'PERSON' ;
9568
9569
9570 IF l_default_role_name IS NOT NULL
9571 THEN
9572
9573 FOR rtp_rec IN c_route_person ( p_step_id => p_step_id
9574 , p_assignee_type_code => l_assignee_type_code )
9575 LOOP
9576 l_assignee_id := rtp_rec.assignee_id ;
9577 l_adhoc_people_flag := rtp_rec.adhoc_people_flag ;
9578
9579 GrantChangeRoleToParty
9580 ( x_return_status => l_return_status
9581 , x_msg_count => l_msg_count
9582 , x_msg_data => l_msg_data
9583 , p_role_name => l_default_role_name
9584 , p_change_id => p_change_id
9585 , p_party_id => l_assignee_id
9586 , p_start_date => SYSDATE
9587 , p_end_date => NULL
9588 ) ;
9589
9590
9591 IF l_return_status <> FND_API.G_RET_STS_SUCCESS
9592 THEN
9593
9594 x_return_status := l_return_status ;
9595 x_msg_count := NVL(l_msg_count, 0) + NVL(l_msg_count,0) ;
9596 x_msg_data := l_msg_data ;
9597
9598 END IF ;
9599
9600 END LOOP ;
9601
9602 END IF ;
9603
9604
9605 EXCEPTION
9606 WHEN OTHERS THEN
9607
9608 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9609
9610 IF FND_MSG_PUB.Check_Msg_Level
9611 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9612 THEN
9613 FND_MSG_PUB.Add_Exc_Msg
9614 ( G_PKG_NAME
9615 , l_api_name
9616 );
9617 END IF;
9618
9619 END GrantChangeRoleToStepPeople ;
9620
9621
9622 --
9623 -- VoteForResultType
9624 -- Because of bug2885157,
9625 -- copied from WF_STANDARD.VoteForResultType 115.46
9626 -- and put Wf_Item_Activity_Status.ClearCache before calling
9627 -- Wf_Item_Activity_Status.Notification_Status to get notification group id correctly
9628 --
9629 --
9630 -- Standard Voting Function
9631 -- IN
9632 -- itemtype - A valid item type from (WF_ITEM_TYPES table).
9633 -- itemkey - A string generated from the application object's primary key.
9634 -- actid - The process activity(instance id).
9635 -- funcmode - Run/Cancel
9636 -- OUT
9637 -- result -
9638 --
9639 -- USED BY ACTIVITIES
9640 --
9641 -- WFSTD.VoteForResultType
9642 --
9643 -- ACTIVITY ATTRIBUTES REFERENCED
9644 -- VOTING_OPTION
9645 -- - WAIT_FOR_ALL_VOTES - Evaluate voting after all votes are cast
9646 -- - or a Timeout condition closes the voting
9647 -- - polls. When a Timeout occurs the
9648 -- - voting percentages are calculated as a
9649 -- - percentage ofvotes cast.
9650 --
9651 -- - REQUIRE_ALL_VOTES - Evaluate voting after all votes are cast.
9652 -- - If a Timeout occurs and all votes have not
9653 -- - been cast then the standard timeout
9654 -- - transition is taken. Votes are calculated
9655 -- - as a percenatage of users notified to vote.
9656 --
9657 -- - TALLY_ON_EVERY_VOTE - Evaluate voting after every vote or a
9658 -- - Timeout condition closes the voting polls.
9659 -- - After every vote voting percentages are
9660 -- - calculated as a percentage of user notified
9661 -- - to vote. After a timeout voting
9662 -- - percentages are calculated as a percentage
9663 -- - of votes cast.
9664 --
9665 -- "One attribute for each of the activities result type codes"
9666 --
9667 -- - The standard Activity VOTEFORRESULTTYPE has the WFSTD_YES_NO
9668 -- - result type assigned.
9669 -- - Thefore activity has two activity attributes.
9670 --
9671 -- Y - Percenatage required for Yes transition
9672 -- N - Percentage required for No transition
9673 --
9674 PROCEDURE VoteForResultType
9675 ( itemtype in varchar2,
9676 itemkey in varchar2,
9677 actid in number,
9678 funcmode in varchar2,
9679 resultout in out NOCOPY varchar2)
9680 IS
9681
9682 -- Select all lookup codes for an activities result type
9683 cursor result_codes is
9684 select wfl.lookup_code result_code
9685 from wf_lookups wfl,
9686 wf_activities wfa,
9687 wf_process_activities wfpa,
9688 wf_items wfi
9689 where wfl.lookup_type = wfa.result_type
9690 and wfa.name = wfpa.activity_name
9691 and wfi.begin_date >= wfa.begin_date
9692 and wfi.begin_date < nvl(wfa.end_date,wfi.begin_date+1)
9693 and wfpa.activity_item_type = wfa.item_type
9694 and wfpa.instance_id = actid
9695 and wfi.item_key = itemkey
9696 and wfi.item_type = itemtype;
9697
9698 l_code_count pls_integer;
9699 l_group_id pls_integer;
9700 l_user varchar2(320);
9701 l_voting_option varchar2(30);
9702 l_per_of_total number;
9703 l_per_of_vote number;
9704 l_per_code number;
9705 per_success number;
9706 max_default pls_integer := 0;
9707 default_result varchar2(30) := '';
9708 result varchar2(30) := '';
9709
9710 wf_invalid_command exception;
9711
9712 begin
9713
9714
9715 IF g_debug_flag THEN
9716 Write_Debug('Start VoteForResultType ...' );
9717 END IF ;
9718
9719 -- Do nothing unless in RUN or TIMEOUT modes
9720 if (funcmode <> wf_engine.eng_run)
9721 and (funcmode <> wf_engine.eng_timeout) then
9722 resultout := wf_engine.eng_null;
9723 return;
9724 end if;
9725
9726 -- SYNCHMODE: Not allowed
9727 if (itemkey = wf_engine.eng_synch) then
9728 Wf_Core.Token('OPERATION', 'Wf_Standard.VotForResultType');
9729 Wf_Core.Raise('WFENG_SYNCH_DISABLED');
9730 end if;
9731
9732 -- Always clear the cache first
9733 -- Bug2885157
9734 -- so it should be safe to force reading from
9735 -- the database.
9736 Wf_Item_Activity_Status.ClearCache;
9737
9738 -- Get Notifications group_id for activity
9739 Wf_Item_Activity_Status.Notification_Status(itemtype,itemkey,actid,
9740 l_group_id,l_user);
9741 l_voting_option := Wf_Engine.GetActivityAttrText(itemtype,itemkey,
9742 actid,'VOTING_OPTION');
9743
9744 IF g_debug_flag THEN
9745 Write_Debug('Got Ntf Group Id: ' || to_char(l_group_id) );
9746 Write_Debug('Got Voting Option : ' || l_voting_option );
9747 END IF ;
9748
9749
9750 if (l_voting_option not in ('REQUIRE_ALL_VOTES', 'WAIT_FOR_ALL_VOTES',
9751 'TALLY_ON_EVERY_VOTE')) then
9752 raise wf_invalid_command;
9753 end if;
9754
9755 -- If here, then the mode is one of:
9756 -- a. TALLY_ON_ALL_VOTES
9757 -- b. WAIT_FOR_ALL_VOTES and timeout has occurred
9758 -- c. WAIT_FOR_ALL_VOTES and all votes are cast
9759 -- d. REQUIRE_ALL_VOTES and all votes are cast
9760 -- Tally votes.
9761 for result_rec in result_codes loop
9762 -- Tally Vote Count for this result code
9763 Wf_Notification.VoteCount(l_group_id,result_rec.result_code,
9764 l_code_count,l_per_of_total,l_per_of_vote);
9765
9766 IF g_debug_flag THEN
9767 Write_Debug('Couting result code : ' || result_rec.result_code );
9768 Write_Debug('Code Count : ' || to_char(l_code_count) );
9769 Write_Debug('Total percent : ' || to_char(l_per_of_total) );
9770 Write_Debug('Percent of vote : ' || to_char(l_per_of_vote) );
9771 END IF ;
9772
9773
9774 -- If this is timeout mode, then use the percent of votes cast so far.
9775 -- If this is run mode, then use the percent of total votes possible.
9776 if (funcmode = wf_engine.eng_timeout) then
9777 l_per_code := l_per_of_vote;
9778 else
9779 l_per_code := l_per_of_total;
9780 end if;
9781
9782 IF g_debug_flag THEN
9783 Write_Debug('Percent of code : ' || to_char(l_per_code) );
9784 END IF ;
9785
9786
9787 -- Get percent vote needed for this result to succeed
9788 per_success := Wf_Engine.GetActivityAttrNumber(itemtype,itemkey,
9789 actid,result_rec.result_code);
9790
9791
9792 IF g_debug_flag THEN
9793 Write_Debug('Percent of Success : ' || to_char(per_success) );
9794 END IF ;
9795
9796
9797 if (per_success is null) then
9798
9799 IF g_debug_flag THEN
9800 Write_Debug('Percent of Success IS NULL ' );
9801 END IF ;
9802
9803 -- Null value means this is a default result.
9804 -- Save the default result with max code_count.
9805 if (l_code_count > max_default) then
9806 max_default := l_code_count;
9807 default_result := result_rec.result_code;
9808 elsif (l_code_count = max_default) then
9809 -- Tie for default result.
9810 default_result := wf_engine.eng_tie;
9811 end if;
9812 else
9813
9814 IF g_debug_flag THEN
9815 Write_Debug('Percent of Success IS NOT NULL ' );
9816 END IF ;
9817
9818 -- If:
9819 -- a. % vote for this result > % needed for success OR
9820 -- b. % vote is 100% AND
9821 -- c. at least 1 vote for this result
9822 -- then this result succeeds.
9823 if (((l_per_code > per_success) or (l_per_code = 100)) and
9824 (l_code_count > 0))
9825 then
9826 if (result is null) then
9827 -- Save satisfied result.
9828 result := result_rec.result_code;
9829
9830 IF g_debug_flag THEN
9831 Write_Debug('Satisfied result ' || result );
9832 END IF ;
9833
9834 else
9835 -- This is the second result to be satisfied. Return a tie.
9836 resultout := wf_engine.eng_completed||':'||wf_engine.eng_tie;
9837
9838 IF g_debug_flag THEN
9839 Write_Debug('This is the second result to be satisfied ' );
9840 END IF ;
9841
9842 return;
9843 end if;
9844 end if;
9845 end if;
9846 end loop;
9847
9848 IF g_debug_flag THEN
9849 Write_Debug('Voting Count Result: ' || result );
9850 END IF ;
9851
9852
9853 if (result is not null) then
9854
9855 IF g_debug_flag THEN
9856 Write_Debug('Satisfied result IS NOT NULL ' );
9857 END IF ;
9858
9859 -- Return the satisfied result code.
9860 resultout := wf_engine.eng_completed||':'||result;
9861 else
9862
9863 IF g_debug_flag THEN
9864 Write_Debug('Satisfied result IS NULL ' );
9865 END IF ;
9866
9867
9868 -- If we get here no non-default results were satisfied.
9869 if (funcmode = wf_engine.eng_run and
9870 wf_notification.OpenNotificationsExist(l_group_id)) then
9871 -- Not timed out and still open notifications.
9872 -- Return waiting to continue voting.
9873
9874 IF g_debug_flag THEN
9875 Write_Debug('Not timed out and still open notifications. Return waiting to continue voting ' );
9876 END IF ;
9877
9878 resultout := wf_engine.eng_waiting;
9879 elsif (default_result is not null) then
9880 -- Either timeout or all notifications closed
9881 -- Return default result if one found.
9882 resultout := wf_engine.eng_completed||':'||default_result;
9883
9884 IF g_debug_flag THEN
9885 Write_Debug('Either timeout or all notifications closed. Return default result if one found ' );
9886 END IF ;
9887
9888 else
9889 -- Timeout or all notifications closed, and no default.
9890 -- Return nomatch
9891
9892 IF g_debug_flag THEN
9893 Write_Debug('Timeout or all notifications closed, and no default. Return nomatch ' );
9894 END IF ;
9895
9896 resultout := wf_engine.eng_completed||':'||wf_engine.eng_nomatch;
9897 end if;
9898 end if;
9899 return;
9900
9901 exception
9902 when wf_invalid_command then
9903 Wf_Core.Context('Wf_Standard', 'VoteForResultType', itemtype,
9904 itemkey, to_char(actid), funcmode);
9905 Wf_Core.Token('COMMAND', l_voting_option);
9906 Wf_Core.Raise('WFSQL_COMMAND');
9907 when others then
9908 Wf_Core.Context('Wf_Standard', 'VoteForResultType',itemtype,
9909 itemkey, to_char(actid), funcmode);
9910 raise;
9911
9912
9913 end VoteForResultType ;
9914
9915 --
9916 -- PeopleLevelVoteCount
9917 -- Count the number of responses for a result_code
9918 -- IN:
9919 -- Gid - Notification group id
9920 -- ResultCode - Result code to be tallied
9921 -- MandatoryResultCode - Result code to be tallied amang mandatory resonses
9922 -- OUT:
9923 -- ResultCount - Number of responses for ResultCode
9924 -- PercentOfTotalPop - % ResultCode ( As a % of total population )
9925 -- PercentOfVotes - % ResultCode ( As a % of votes cast )
9926 --
9927 procedure PeopleLevelVoteCount
9928 (Gid in number,
9929 ResultCode in varchar2,
9930 MandatoryResultCode in varchar2,
9931 StepId in number,
9932 ResultCount out nocopy number,
9933 PercentOfTotalPop out nocopy number,
9934 PercentOfVotes out nocopy number )
9935 is
9936 l_code_count pls_integer;
9937 l_total_pop pls_integer;
9938 l_total_voted pls_integer;
9939 begin
9940
9941
9942 IF g_debug_flag THEN
9943 Write_Debug('Start PeopleLevelVoteCount. . . for Step ' || to_char(StepId) );
9944 Write_Debug('ResultCode ' || ResultCode );
9945 Write_Debug('MandatoryResultCode ' || MandatoryResultCode );
9946 END IF ;
9947
9948 IF MandatoryResultCode IS NOT NULL AND
9949 ( MandatoryResultCode = ResultCode
9950 OR Eng_Workflow_Util.G_MANDATORY_RESP_ANY = MandatoryResultCode
9951 ) -- Added for Route
9952 THEN
9953
9954 --
9955 --
9956 --
9957 SELECT COUNT(*)
9958 INTO l_total_pop
9959 FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
9960 , EGO_USER_V UserV
9961 , WF_NOTIFICATIONS wn
9962 WHERE RoutePeople.assignee_id = UserV.party_id
9963 AND RoutePeople.response_condition_code = 'MANDATORY'
9964 AND RoutePeople.step_id = StepId
9965 AND UserV.user_name = wn.recipient_role
9966 AND wn.group_id = Gid;
9967
9968
9969 SELECT COUNT(*)
9970 INTO l_total_voted
9971 FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
9972 , EGO_USER_V UserV
9973 , WF_NOTIFICATIONS wn
9974 WHERE RoutePeople.assignee_id = UserV.party_id
9975 AND RoutePeople.response_condition_code = 'MANDATORY'
9976 AND RoutePeople.step_id = StepId
9977 AND UserV.user_name = wn.recipient_role
9978 AND wn.status = 'CLOSED'
9979 AND wn.group_id = Gid;
9980
9981
9982 SELECT COUNT(*)
9983 INTO l_code_count
9984 FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
9985 , EGO_USER_V UserV
9986 , WF_NOTIFICATION_ATTRIBUTES wfna
9987 , WF_NOTIFICATIONS wn
9988 WHERE RoutePeople.assignee_id = UserV.party_id
9989 AND RoutePeople.response_condition_code = 'MANDATORY'
9990 AND RoutePeople.step_id = StepId
9991 AND UserV.user_name = wn.recipient_role
9992 AND wfna.name = 'RESULT'
9993 AND wfna.text_value = ResultCode
9994 AND wn.notification_id = wfna.notification_id
9995 AND wn.status = 'CLOSED'
9996 AND wn.group_id = Gid;
9997
9998 ResultCount := l_code_count;
9999
10000
10001
10002 IF g_debug_flag THEN
10003 Write_Debug('After Query Data for Step Assigness. . .' );
10004 Write_Debug('l_total_pop: ' || to_char(l_total_pop) );
10005 Write_Debug('l_total_voted: ' || to_char(l_total_voted) );
10006 Write_Debug('l_code_count: ' || to_char(l_code_count) );
10007 END IF ;
10008
10009 IF ( Eng_Workflow_Util.G_MANDATORY_RESP_ANY = MandatoryResultCode )
10010 THEN
10011
10012 IF g_debug_flag THEN
10013 Write_Debug('In case Mandaotry Response Code is ANY. . .' );
10014 END IF ;
10015
10016 --
10017 -- Prevent division by zero if group has no notifications
10018 --
10019 if ( l_total_pop = 0 ) then
10020 --
10021 PercentOfTotalPop := 0;
10022 --
10023 else
10024 --
10025 PercentOfTotalPop := l_code_count/l_total_pop*100;
10026 --
10027 end if;
10028
10029 --
10030 -- Prevent division by zero if nobody votes
10031 --
10032 if ( l_total_voted = 0 ) then
10033 --
10034 PercentOfVotes := 0;
10035 --
10036 else
10037 -- Need to wait until all mandatory assignees repond
10038 IF l_total_voted = l_total_pop THEN
10039
10040 IF g_debug_flag THEN
10041 Write_Debug('Total Vote and Total Pop is same. PercentOfVotes is 100. . .' );
10042 END IF ;
10043 PercentOfVotes := 100;
10044
10045 ELSE
10046 IF g_debug_flag THEN
10047 Write_Debug('Total Vote and Total Pop is NOT same. PercentOfVotes is 0. . .' );
10048 END IF ;
10049
10050 PercentOfVotes := 0 ;
10051
10052 END IF ;
10053 --
10054 end if;
10055
10056
10057 ELSE
10058
10059 --
10060 -- Prevent division by zero if group has no notifications
10061 --
10062 if ( l_total_pop = 0 ) then
10063 --
10064 PercentOfTotalPop := 0;
10065 --
10066 else
10067 --
10068 PercentOfTotalPop := l_code_count/l_total_pop*100;
10069 --
10070 end if;
10071 --
10072 -- Prevent division by zero if nobody votes
10073 --
10074 if ( l_total_voted = 0 ) then
10075 --
10076 PercentOfVotes := 0;
10077 --
10078 else
10079 --
10080 PercentOfVotes := l_code_count/l_total_voted*100;
10081 --
10082 end if;
10083
10084 END IF ;
10085
10086
10087 ELSE
10088
10089 Wf_Notification.VoteCount
10090 (Gid => Gid ,
10091 ResultCode => ResultCode ,
10092 ResultCount => ResultCount,
10093 PercentOfTotalPop => PercentOfTotalPop,
10094 PercentOfVotes => PercentOfVotes) ;
10095
10096
10097 END IF ;
10098
10099
10100 exception
10101 when others then
10102 wf_core.context('Eng_Workflow_Util',
10103 'PeopleLevelVoteCount',
10104 to_char(gid),
10105 ResultCode );
10106 raise;
10107 end PeopleLevelVoteCount;
10108
10109
10110 --
10111 -- PeopleLevelVoteForResultType
10112 --
10113 -- Route People Level Standard Voting Function
10114 -- IN
10115 -- itemtype - A valid item type from (WF_ITEM_TYPES table).
10116 -- itemkey - A string generated from the application object's primary key.
10117 -- actid - The process activity(instance id).
10118 -- funcmode - Run/Cancel
10119 -- OUT
10120 -- result -
10121 --
10122 -- USED BY ACTIVITIES
10123 --
10124 -- Route Notofication Call Back Functions
10125 --
10126 -- ACTIVITY ATTRIBUTES REFERENCED
10127 -- VOTING_OPTION
10128 -- Eng_Workflow_Util.G_PEOPLE - Evaluate voting after every vote.
10129 -- - After every vote voting percentages are
10130 -- - calculated as a percentage of user specified as
10131 -- - mandatory notified to vote. voting
10132 -- - percentages are calculated as a percentage
10133 -- - of votes cast.
10134 --
10135 -- "One attribute for each of the activities result type codes"
10136 -- MANDATORY -- Specified MANDATORY result type code
10137 --
10138 --
10139 PROCEDURE PeopleLevelVoteForResultType
10140 ( itemtype in varchar2,
10141 itemkey in varchar2,
10142 actid in number,
10143 funcmode in varchar2,
10144 resultout in out NOCOPY varchar2)
10145 IS
10146
10147 -- Select all lookup codes for an activities result type
10148 cursor result_codes is
10149 select wfl.lookup_code result_code
10150 from wf_lookups wfl,
10151 wf_activities wfa,
10152 wf_process_activities wfpa,
10153 wf_items wfi
10154 where wfl.lookup_type = wfa.result_type
10155 and wfa.name = wfpa.activity_name
10156 and wfi.begin_date >= wfa.begin_date
10157 and wfi.begin_date < nvl(wfa.end_date,wfi.begin_date+1)
10158 and wfpa.activity_item_type = wfa.item_type
10159 and wfpa.instance_id = actid
10160 and wfi.item_key = itemkey
10161 and wfi.item_type = itemtype;
10162
10163 l_code_count pls_integer;
10164 l_group_id pls_integer;
10165 l_user varchar2(320);
10166 l_voting_option varchar2(30);
10167 l_per_of_total number;
10168 l_per_of_vote number;
10169 l_per_code number;
10170 per_success number;
10171 max_default pls_integer := 0;
10172 default_result varchar2(30) := '';
10173 result varchar2(30) := '';
10174
10175 l_mandatory_result varchar2(30);
10176 l_route_step_id number;
10177
10178 wf_invalid_command exception;
10179
10180 begin
10181
10182
10183 IF g_debug_flag THEN
10184 Write_Debug('Start PeopleLevelVoteForResultType...' );
10185 END IF ;
10186
10187 -- Do nothing unless in RUN or TIMEOUT modes
10188 if (funcmode <> wf_engine.eng_run)
10189 and (funcmode <> wf_engine.eng_timeout) then
10190 resultout := wf_engine.eng_null;
10191 return;
10192 end if;
10193
10194 -- SYNCHMODE: Not allowed
10195 if (itemkey = wf_engine.eng_synch) then
10196 Wf_Core.Token('OPERATION', 'Eng_Workflow_Util.PeopleLevelVoteForResultType');
10197 Wf_Core.Raise('WFENG_SYNCH_DISABLED');
10198 end if;
10199
10200 -- Always clear the cache first
10201 -- Bug2885157
10202 -- so it should be safe to force reading from
10203 -- the database.
10204 Wf_Item_Activity_Status.ClearCache;
10205
10206
10207 -- Get Notifications group_id for activity
10208 Wf_Item_Activity_Status.Notification_Status(itemtype,itemkey,actid,
10209 l_group_id,l_user);
10210
10211 -- Get Voting Option
10212 l_voting_option := Wf_Engine.GetActivityAttrText(itemtype,itemkey,
10213 actid,'VOTING_OPTION');
10214
10215 l_mandatory_result := Wf_Engine.GetActivityAttrText(itemtype,itemkey,
10216 actid,'MANDATORY', true);
10217
10218
10219 IF g_debug_flag THEN
10220 Write_Debug('Got Ntf Group Id: ' || to_char(l_group_id) );
10221 Write_Debug('Got Voting Option : ' || l_voting_option );
10222 Write_Debug('Got Mandotory Result Option : ' || l_mandatory_result );
10223 END IF ;
10224
10225
10226 if (l_voting_option not in ('REQUIRE_ALL_VOTES', 'WAIT_FOR_ALL_VOTES',
10227 'TALLY_ON_EVERY_VOTE'))
10228 AND (l_voting_option <> Eng_Workflow_Util.G_PEOPLE ) -- Added for Route
10229 then
10230 raise wf_invalid_command;
10231 end if;
10232
10233 -- If here, then the mode is one of:
10234 -- a. TALLY_ON_ALL_VOTES
10235 -- b. WAIT_FOR_ALL_VOTES and timeout has occurred
10236 -- c. WAIT_FOR_ALL_VOTES and all votes are cast
10237 -- d. REQUIRE_ALL_VOTES and all votes are cast
10238 -- Tally votes.
10239 for result_rec in result_codes loop
10240
10241 IF (l_voting_option = Eng_Workflow_Util.G_PEOPLE
10242 AND ( ( l_mandatory_result IS NOT NULL
10243 AND l_mandatory_result = result_rec.result_code )
10244 OR l_mandatory_result = Eng_Workflow_Util.G_MANDATORY_RESP_ANY
10245 )
10246 )
10247 THEN
10248
10249
10250 IF g_debug_flag THEN
10251 Write_Debug('Calling Eng_Workflow_Util.PeopleLevelVoteCount . . .' );
10252 Write_Debug('Step Id : ' || to_char(l_route_step_id) );
10253 END IF ;
10254
10255 -- Get Route Step Id
10256 GetRouteStepId
10257 ( p_item_type => itemtype
10258 , p_item_key => itemkey
10259 , x_route_step_id => l_route_step_id
10260 ) ;
10261
10262 -- Tally Vote Count for this result code
10263 -- in case that Votion Option is Assignee Level(PEOPLE)
10264 -- and it is reponse code should be tallied among mandatory responses
10265 Eng_Workflow_Util.PeopleLevelVoteCount
10266 (Gid => l_group_id,
10267 ResultCode => result_rec.result_code,
10268 MandatoryResultCode => l_mandatory_result,
10269 ResultCount => l_code_count,
10270 StepId => l_route_step_id,
10271 PercentOfTotalPop => l_per_of_total,
10272 PercentOfVotes => l_per_of_vote ) ;
10273
10274
10275 ELSE
10276
10277 -- Tally Vote Count for this result code
10278 Wf_Notification.VoteCount(l_group_id,result_rec.result_code,
10279 l_code_count,l_per_of_total,l_per_of_vote);
10280
10281 END IF ;
10282
10283
10284 IF g_debug_flag THEN
10285 Write_Debug('Couting result code : ' || result_rec.result_code );
10286 Write_Debug('Code Count : ' || to_char(l_code_count) );
10287 Write_Debug('Total percent : ' || to_char(l_per_of_total) );
10288 Write_Debug('Percent of vote : ' || to_char(l_per_of_vote) );
10289 END IF ;
10290
10291
10292 -- If this is timeout mode, then use the percent of votes cast so far.
10293 -- If this is run mode, then use the percent of total votes possible.
10294 if (funcmode = wf_engine.eng_timeout) then
10295 l_per_code := l_per_of_vote;
10296 else
10297 l_per_code := l_per_of_total;
10298 end if;
10299
10300 IF g_debug_flag THEN
10301 Write_Debug('Percent of code : ' || to_char(l_per_code) );
10302 END IF ;
10303
10304
10305 -- Get percent vote needed for this result to succeed
10306 per_success := Wf_Engine.GetActivityAttrNumber(itemtype,itemkey,
10307 actid,result_rec.result_code);
10308
10309
10310 IF g_debug_flag THEN
10311 Write_Debug('Percent of Success : ' || to_char(per_success) );
10312 END IF ;
10313
10314
10315 if (per_success is null) then
10316
10317 IF g_debug_flag THEN
10318 Write_Debug('Percent of Success IS NULL ' );
10319 END IF ;
10320
10321 -- Null value means this is a default result.
10322 -- Save the default result with max code_count.
10323 if (l_code_count > max_default) then
10324 max_default := l_code_count;
10325 default_result := result_rec.result_code;
10326 elsif (l_code_count = max_default) then
10327 -- Tie for default result.
10328 default_result := wf_engine.eng_tie;
10329 end if;
10330 else
10331
10332 IF g_debug_flag THEN
10333 Write_Debug('Percent of Success IS NOT NULL ' );
10334 END IF ;
10335
10336 -- If:
10337 -- a. % vote for this result > % needed for success OR
10338 -- b. % vote is 100% AND
10339 -- c. at least 1 vote for this result
10340 -- then this result succeeds.
10341 if (((l_per_code > per_success) or (l_per_code = 100)) and
10342 (l_code_count > 0))
10343 then
10344 if (result is null) then
10345 -- Save satisfied result.
10346 result := result_rec.result_code;
10347
10348 IF g_debug_flag THEN
10349 Write_Debug('Satisfied result ' || result );
10350 END IF ;
10351
10352 else
10353 -- This is the second result to be satisfied. Return a tie.
10354 resultout := wf_engine.eng_completed||':'||wf_engine.eng_tie;
10355
10356 IF g_debug_flag THEN
10357 Write_Debug('This is the second result to be satisfied ' );
10358 END IF ;
10359
10360 return;
10361 end if;
10362 end if;
10363 end if;
10364 end loop;
10365
10366 IF g_debug_flag THEN
10367 Write_Debug('Voting Count Result: ' || result );
10368 END IF ;
10369
10370
10371 if (result is not null) then
10372
10373 IF g_debug_flag THEN
10374 Write_Debug('Satisfied result IS NOT NULL ' );
10375 END IF ;
10376
10377 -- Return the satisfied result code.
10378 resultout := wf_engine.eng_completed||':'||result;
10379 else
10380
10381 IF g_debug_flag THEN
10382 Write_Debug('Satisfied result IS NULL ' );
10383 END IF ;
10384
10385
10386 -- If we get here no non-default results were satisfied.
10387 if (funcmode = wf_engine.eng_run and
10388 wf_notification.OpenNotificationsExist(l_group_id)) then
10389 -- Not timed out and still open notifications.
10390 -- Return waiting to continue voting.
10391
10392 IF g_debug_flag THEN
10393 Write_Debug('Not timed out and still open notifications. Return waiting to continue voting ' );
10394 END IF ;
10395
10396 resultout := wf_engine.eng_waiting;
10397 elsif (default_result is not null) then
10398 -- Either timeout or all notifications closed
10399 -- Return default result if one found.
10400 resultout := wf_engine.eng_completed||':'||default_result;
10401
10402 IF g_debug_flag THEN
10403 Write_Debug('Either timeout or all notifications closed. Return default result if one found ' );
10404 END IF ;
10405
10406 else
10407 -- Timeout or all notifications closed, and no default.
10408 -- Return nomatch
10409
10410 IF g_debug_flag THEN
10411 Write_Debug('Timeout or all notifications closed, and no default. Return nomatch ' );
10412 END IF ;
10413
10414 resultout := wf_engine.eng_completed||':'||wf_engine.eng_nomatch;
10415 end if;
10416 end if;
10417 return;
10418
10419
10420 exception
10421 when wf_invalid_command then
10422 Wf_Core.Context('Eng_Workflow_Util', 'PeopleLevelVoteForResultType', itemtype,
10423 itemkey, to_char(actid), funcmode);
10424 Wf_Core.Token('COMMAND', l_voting_option);
10425 Wf_Core.Raise('WFSQL_COMMAND');
10426 when others then
10427 Wf_Core.Context('Eng_Workflow_Util', 'PeopleLevelVoteForResultType',itemtype,
10428 itemkey, to_char(actid), funcmode);
10429 raise;
10430
10431
10432 END PeopleLevelVoteForResultType ;
10433
10434
10435 PROCEDURE RouteStepVoteForResultType
10436 ( itemtype in varchar2,
10437 itemkey in varchar2,
10438 actid in number,
10439 funcmode in varchar2,
10440 resultout in out NOCOPY varchar2)
10441 IS
10442
10443 l_voting_option VARCHAR2(30);
10444
10445 BEGIN
10446
10447
10448 IF g_debug_flag THEN
10449 Write_Debug('Start RouteStepVoteForResultType...' );
10450 Write_Debug('-----------------------------------------------------');
10451 Write_Debug('Item Type : ' || itemtype );
10452 Write_Debug('Item Key : ' || itemkey );
10453 Write_Debug('Acttivity Id : ' || to_char(actid));
10454 Write_Debug('-----------------------------------------------------');
10455 END IF ;
10456
10457 -- Get Voting Option
10458 l_voting_option := Wf_Engine.GetActivityAttrText(itemtype,itemkey,
10459 actid,'VOTING_OPTION');
10460
10461
10462
10463 IF g_debug_flag THEN
10464 Write_Debug('Voting Option: ' || l_voting_option );
10465 END IF ;
10466
10467 if (l_voting_option in (Eng_Workflow_Util.G_WAIT_FOR_ALL_VOTES,
10468 Eng_Workflow_Util.G_REQUIRE_ALL_VOTES,
10469 Eng_Workflow_Util.G_TALLY_ON_EVERY_VOTE)
10470 )
10471 then
10472
10473
10474 IF g_debug_flag THEN
10475 Write_Debug('Calling Eng_Workflow_Util.VoteForResultType . . . ' );
10476 END IF ;
10477
10478 Eng_Workflow_Util.VoteForResultType
10479 ( itemtype
10480 , itemkey
10481 , actid
10482 , funcmode
10483 , resultout ) ;
10484
10485 elsif (l_voting_option = Eng_Workflow_Util.G_PEOPLE)
10486 then
10487
10488
10489 IF g_debug_flag THEN
10490 Write_Debug('Calling Eng_Workflow_Util.Eng_Workflow_Util.PeopleLevelVoteForResultType . . . ' );
10491 END IF ;
10492
10493 Eng_Workflow_Util.PeopleLevelVoteForResultType
10494 ( itemtype
10495 , itemkey
10496 , actid
10497 , funcmode
10498 , resultout ) ;
10499
10500 end if;
10501
10502
10503 IF g_debug_flag THEN
10504 Write_Debug('RouteStepVoteForResultType Result: ' || resultout );
10505 END IF ;
10506
10507
10508 END RouteStepVoteForResultType ;
10509
10510
10511 PROCEDURE ContinueHeaderRoute
10512 ( x_return_status OUT NOCOPY VARCHAR2
10513 , x_msg_count OUT NOCOPY NUMBER
10514 , x_msg_data OUT NOCOPY VARCHAR2
10515 , p_item_type IN VARCHAR2
10516 , p_item_key IN VARCHAR2
10517 , p_actid IN NUMBER
10518 , p_waiting_activity IN VARCHAR2
10519 , p_waiting_flow_type IN VARCHAR2
10520 , x_resultout IN OUT NOCOPY VARCHAR2
10521 )
10522 IS
10523
10524 l_change_id NUMBER ;
10525 l_line_approval_status NUMBER ;
10526
10527 l_return_status VARCHAR2(1);
10528 l_msg_count NUMBER ;
10529 l_msg_data VARCHAR2(200);
10530
10531 l_parent_itemtype varchar2(8);
10532 l_parent_itemkey varchar2(240);
10533 dummy varchar2(240);
10534
10535 CURSOR c_header_route_wf (p_change_id NUMBER)
10536 IS
10537 SELECT ecr.wf_item_type parent_item_type
10538 , ecr.wf_item_key parent_item_key
10539 FROM ENG_CHANGE_ROUTES ecr
10540 , ENG_ENGINEERING_CHANGES eec
10541 , WF_ITEMS wi
10542 WHERE wi.item_type = ecr.wf_item_type
10543 AND wi.item_key = ecr.wf_item_key
10544 AND wi.end_date IS NULL
10545 AND ecr.route_id = eec.route_id
10546 AND eec.change_id = p_change_id ;
10547
10548
10549 l_debug VARCHAR2(1) := FND_API.G_FALSE ;
10550 l_output_dir VARCHAR2(240) := NULL ;
10551 l_debug_filename VARCHAR2(200) := 'ContinueHeaderRoute.log' ;
10552
10553
10554
10555 BEGIN
10556
10557
10558
10559 IF g_debug_flag THEN
10560 Write_Debug('Eng_Workflow_Util.ContinueHeaderRouteLog');
10561 Write_Debug('-----------------------------------------------------');
10562 Write_Debug('Item Type : ' || p_item_type );
10563 Write_Debug('Item Key : ' || p_item_key );
10564 Write_Debug('Acttivity Id : ' || to_char(p_actid));
10565 Write_Debug('Waiting Activity : ' || p_waiting_activity );
10566 Write_Debug('Waiting Flow Type : ' || p_waiting_flow_type);
10567 Write_Debug('-----------------------------------------------------');
10568 END IF ;
10569
10570 -- Initialize API return status to success
10571 x_return_status := FND_API.G_RET_STS_SUCCESS;
10572
10573
10574 if (p_waiting_flow_type = 'APPROVAL') then
10575
10576 -- Get Change Object Identifier
10577 Eng_Workflow_Util.GetChangeObject
10578 ( p_item_type => p_item_type
10579 , p_item_key => p_item_key
10580 , x_change_id => l_change_id
10581 ) ;
10582
10583 --
10584 -- Get Header Route worklfow parent details
10585 --
10586 FOR l_header_wf_rec IN c_header_route_wf(p_change_id => l_change_id )
10587 LOOP
10588
10589 l_parent_itemtype := l_header_wf_rec.parent_item_type ;
10590 l_parent_itemkey := l_header_wf_rec.parent_item_key ;
10591
10592
10593 IF g_debug_flag THEN
10594 Write_Debug('Header Item Type : ' || l_parent_itemtype );
10595 Write_Debug('Header Item Key : ' || l_parent_itemkey);
10596 END IF ;
10597
10598
10599 END LOOP ;
10600
10601 IF l_parent_itemtype IS NOT NULL AND l_parent_itemkey IS NOT NULL
10602 THEN
10603
10604 IF g_debug_flag THEN
10605 Write_Debug('lock the parent item, so only one child can execute this at the time. ' );
10606 END IF ;
10607
10608
10609 -- lock the parent item, so only one child can execute this at the time.
10610 SELECT item_key
10611 INTO dummy
10612 FROM wf_items
10613 WHERE item_type = l_parent_itemtype
10614 AND item_key = l_parent_itemkey
10615 FOR UPDATE ;
10616
10617 Eng_Workflow_Util.CheckAllLineApproved
10618 ( x_return_status => x_return_status
10619 , x_msg_count => x_msg_count
10620 , x_msg_data => x_msg_data
10621 , p_change_id => l_change_id
10622 , x_line_approval_status => l_line_approval_status
10623 ) ;
10624
10625
10626 IF g_debug_flag THEN
10627 Write_Debug('After calling CheckAllLineApproved, line appr status: ' || to_char(l_line_approval_status) );
10628 END IF ;
10629
10630 IF l_line_approval_status = Eng_Workflow_Util.G_APPROVED
10631 THEN
10632
10633
10634 begin
10635
10636 IF g_debug_flag THEN
10637 Write_Debug('calling CompleteActivity . . . ');
10638 END IF ;
10639
10640 wf_engine.CompleteActivity
10641 ( l_parent_itemtype
10642 , l_parent_itemkey
10643 , p_waiting_activity
10644 , wf_engine.eng_null );
10645
10646 exception
10647 when others then
10648 --
10649 -- If call to CompleteActivity cannot find activity, return null
10650 -- and wait for master flow
10651 --
10652 if ( wf_core.error_name = 'WFENG_NOT_NOTIFIED' ) then
10653 wf_core.clear;
10654 x_resultout := wf_engine.eng_null;
10655 IF g_debug_flag THEN
10656 Write_Debug('call to CompleteActivity cannot find activity. . . ');
10657 END IF ;
10658 else
10659 raise;
10660 end if;
10661 end;
10662
10663 END IF ;
10664
10665 END IF ; -- parent item type and key are not null
10666
10667 x_resultout := wf_engine.eng_null;
10668 return ;
10669
10670 else
10671 -- p_waiting_flow is not APPROVAL
10672 null ;
10673
10674 end if ; -- p_waiting_flow condition
10675
10676
10677 END ContinueHeaderRoute ;
10678
10679
10680 PROCEDURE WaitForLineRoute
10681 ( x_return_status OUT NOCOPY VARCHAR2
10682 , x_msg_count OUT NOCOPY NUMBER
10683 , x_msg_data OUT NOCOPY VARCHAR2
10684 , p_item_type IN VARCHAR2
10685 , p_item_key IN VARCHAR2
10686 , p_actid IN NUMBER
10687 , p_continuation_activity IN VARCHAR2
10688 , p_continuation_flow_type IN VARCHAR2
10689 , x_resultout IN OUT NOCOPY VARCHAR2
10690 )
10691 IS
10692
10693 l_change_id NUMBER ;
10694 l_line_approval_status NUMBER ;
10695
10696 l_return_status VARCHAR2(1);
10697 l_msg_count NUMBER ;
10698 l_msg_data VARCHAR2(200);
10699
10700 BEGIN
10701
10702
10703 -- Initialize API return status to success
10704 x_return_status := FND_API.G_RET_STS_SUCCESS;
10705
10706
10707 if (p_continuation_flow_type = 'APPROVAL') then
10708
10709 -- Get Change Object Identifier
10710 Eng_Workflow_Util.GetChangeObject
10711 ( p_item_type => p_item_type
10712 , p_item_key => p_item_key
10713 , x_change_id => l_change_id
10714 ) ;
10715
10716 Eng_Workflow_Util.CheckAllLineApproved
10717 ( x_return_status => x_return_status
10718 , x_msg_count => x_msg_count
10719 , x_msg_data => x_msg_data
10720 , p_change_id => l_change_id
10721 , x_line_approval_status => l_line_approval_status
10722 ) ;
10723
10724
10725 IF l_line_approval_status <> Eng_Workflow_Util.G_APPROVED
10726 THEN
10727 x_resultout := wf_engine.eng_notified ||':'||
10728 wf_engine.eng_null ||':'||
10729 wf_engine.eng_null;
10730 ELSE
10731 x_resultout := wf_engine.eng_null;
10732 END IF ;
10733
10734 return ;
10735
10736 else
10737
10738 null ;
10739
10740 end if ;
10741
10742 END WaitForLineRoute ;
10743
10744
10745 PROCEDURE START_RESPONSE_FYI_PROCESS
10746 ( p_itemtype IN VARCHAR2
10747 , p_itemkey IN VARCHAR2
10748 , p_orig_response_option IN VARCHAR2 := NULL -- ALL or ONE
10749 , p_responded_ntf_id IN NUMBER
10750 , p_responded_comment_id IN NUMBER := NULL
10751 , x_msg_count OUT NOCOPY NUMBER
10752 , x_msg_data OUT NOCOPY VARCHAR2
10753 , x_return_status OUT NOCOPY VARCHAR2
10754 )
10755 IS
10756 lUserId NUMBER ;
10757
10758 l_adhoc_party VARCHAR2(30000);
10759 l_orig_adhoc_role VARCHAR2(100) ;
10760
10761 l_orig_user_id NUMBER ;
10762 l_orig_party_id NUMBER ;
10763 l_change_id NUMBER ;
10764 l_item_key NUMBER;
10765
10766
10767 CURSOR c_ntf_info (p_ntf_id NUMBER)
10768 IS
10769
10770 SELECT UserV.user_id user_id
10771 FROM EGO_USER_V UserV
10772 , WF_NOTIFICATIONS wf
10773 WHERE UserV.user_name = wf.recipient_role
10774 AND wf.notification_id = p_ntf_id ;
10775
10776
10777 CURSOR c_person_id (p_user_id NUMBER)
10778 IS
10779 SELECT UserV.party_id person_id
10780 FROM EGO_USER_V UserV
10781 WHERE UserV.user_id = p_user_id ;
10782
10783 BEGIN
10784
10785
10786 FOR ntf_info_rec IN c_ntf_info (p_ntf_id => p_responded_ntf_id)
10787 LOOP
10788
10789 lUserId := ntf_info_rec.user_id ;
10790
10791 END LOOP ;
10792
10793
10794 -- Get Original user_id and party_id who launched workflow
10795 l_orig_user_id := wf_engine.GetItemAttrNumber
10796 ( p_itemtype
10797 , p_itemkey
10798 , 'WF_USER_ID'
10799 );
10800
10801
10802 FOR l_rec IN c_person_id (l_orig_user_id)
10803 LOOP
10804
10805 l_orig_party_id := l_rec.person_Id ;
10806
10807 END LOOP ;
10808
10809
10810 Eng_Workflow_util.GetChangeObject( p_item_type => p_itemtype
10811 , p_item_key => p_itemKey
10812 , x_change_id => l_change_Id
10813 );
10814
10815
10816 -- create and start Response FYI process to send Resp FYI ntf
10817 Eng_Workflow_Util.StartWorkflow
10818 ( p_api_version => 1.0
10819 , p_init_msg_list => FND_API.G_FALSE
10820 , p_commit => FND_API.G_FALSE
10821 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
10822 , x_return_status => x_return_status
10823 , x_msg_count => x_msg_count
10824 , x_msg_data => x_msg_data
10825 , p_item_type => G_CHANGE_ACTION_ITEM_TYPE
10826 , x_item_key => l_item_key
10827 , p_process_name => G_RESPONSE_FYI_PROC
10828 , p_change_id => l_change_id
10829 , p_change_line_id => 0
10830 , p_wf_user_id => lUserId
10831 , p_host_url => NULL
10832 , p_action_id => p_responded_comment_id
10833 , p_adhoc_party_list => l_orig_party_id
10834 , p_route_id => 0
10835 , p_route_step_id => 0
10836 , p_parent_item_type => p_itemtype
10837 , p_parent_item_key => p_itemkey
10838 , p_debug => FND_API.G_FALSE
10839 , p_output_dir => NULL
10840 , p_debug_filename => 'Eng_ChangeWF_Start.log'
10841 ) ;
10842
10843
10844 END START_RESPONSE_FYI_PROCESS ;
10845
10846
10847 PROCEDURE StartValidateDefProcess
10848 ( x_msg_count OUT NOCOPY NUMBER
10849 , x_msg_data OUT NOCOPY VARCHAR2
10850 , x_return_status OUT NOCOPY VARCHAR2
10851 , x_val_def_item_key OUT NOCOPY VARCHAR2
10852 , p_step_item_type IN VARCHAR2
10853 , p_step_item_key IN VARCHAR2
10854 , p_responded_ntf_id IN NUMBER
10855 , p_route_id IN NUMBER
10856 , p_route_step_id IN NUMBER
10857 , p_val_def_item_type IN VARCHAR2
10858 , p_val_def_process_name IN VARCHAR2
10859 , p_orig_response IN VARCHAR2 := NULL
10860 , p_host_url IN VARCHAR2 := NULL
10861 )
10862 IS
10863 PRAGMA AUTONOMOUS_TRANSACTION;
10864
10865 l_api_name CONSTANT VARCHAR2(30) := 'StartValidateDefProcess';
10866
10867 l_debug VARCHAR2(1) := FND_API.G_FALSE ;
10868 l_output_dir VARCHAR2(240) := NULL ;
10869 l_debug_filename VARCHAR2(200) := 'StartValidateDefProcess.log' ;
10870
10871 l_resp_user_id NUMBER ;
10872 l_adhoc_party VARCHAR2(30000);
10873 l_orig_adhoc_role VARCHAR2(100) ;
10874
10875 l_orig_user_id NUMBER ;
10876 l_orig_party_id NUMBER ;
10877 l_change_id NUMBER ;
10878 l_item_key NUMBER;
10879
10880 l_msg_count NUMBER ;
10881 l_msg_data VARCHAR2(2000) ;
10882 l_return_status VARCHAR2(1) ;
10883
10884 CURSOR c_ntf_info (p_ntf_id NUMBER)
10885 IS
10886
10887 SELECT UserV.user_id user_id
10888 FROM EGO_USER_V UserV
10889 , WF_NOTIFICATIONS wf
10890 WHERE UserV.user_name = wf.recipient_role
10891 AND wf.notification_id = p_ntf_id ;
10892
10893
10894 CURSOR c_person_id (p_user_id NUMBER)
10895 IS
10896 SELECT UserV.party_id person_id
10897 FROM EGO_USER_V UserV
10898 WHERE UserV.user_id = p_user_id ;
10899
10900 BEGIN
10901
10902 x_return_status := FND_API.G_RET_STS_SUCCESS ;
10903
10904
10905 IF g_debug_flag THEN
10906 Write_Debug('Eng_Workflow_Util.StartValidateDefProcess Log');
10907 Write_Debug('-----------------------------------------------------');
10908 Write_Debug('Step Item Type : ' || p_step_item_type );
10909 Write_Debug('Step Item Key : ' || p_step_item_key );
10910 Write_Debug('Route Id : ' || TO_CHAR(p_route_id) );
10911 Write_Debug('Step Id : ' || TO_CHAR(p_route_step_id) );
10912 Write_Debug('Responded Ntf Id : ' || TO_CHAR(p_responded_ntf_id) );
10913 Write_Debug('-----------------------------------------------------');
10914 END IF ;
10915
10916 FOR ntf_info_rec IN c_ntf_info (p_ntf_id => p_responded_ntf_id)
10917 LOOP
10918 l_resp_user_id := ntf_info_rec.user_id ;
10919 END LOOP ;
10920
10921 BEGIN
10922 l_return_status := FND_API.G_RET_STS_SUCCESS ;
10923
10924 -- FND_MSG_PUB.initialize ;
10925 Eng_Workflow_Util.StartWorkflow
10926 ( p_api_version => 1.0
10927 , p_init_msg_list => FND_API.G_FALSE
10928 , p_commit => FND_API.G_FALSE
10929 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
10930 , x_return_status => l_return_status
10931 , x_msg_count => l_msg_count
10932 , x_msg_data => l_msg_data
10933 , p_item_type => p_val_def_item_type
10934 , x_item_key => x_val_def_item_key
10935 , p_process_name => p_val_def_process_name
10936 , p_wf_user_id => l_resp_user_id
10937 , p_host_url => p_host_url
10938 , p_route_id => p_route_id
10939 , p_route_step_id => p_route_step_id
10940 , p_adhoc_party_list => l_resp_user_id
10941 , p_parent_item_type => p_step_item_type
10942 , p_parent_item_key => p_step_item_key
10943 , p_debug => l_debug
10944 , p_output_dir => l_output_dir
10945 , p_debug_filename => l_debug_filename
10946 ) ;
10947
10948
10949 IF g_debug_flag THEN
10950 Write_Debug('After call Eng_Workflow_Util.StartWorkflow' ) ;
10951 Write_Debug('Return Status: ' || l_return_status ) ;
10952 Write_Debug('Return Message: ' || l_msg_data ) ;
10953 Write_Debug('Started Val Def WF Item Type: ' || p_val_def_item_type ) ;
10954 Write_Debug('Started Val Def WF Item Kye: ' || x_val_def_item_key ) ;
10955 Write_Debug('Started Val Def WF Process Name: ' || p_val_def_process_name ) ;
10956 END IF ;
10957
10958
10959 IF l_return_status = FND_API.G_RET_STS_SUCCESS
10960 THEN
10961
10962 COMMIT ;
10963
10964 ELSE
10965
10966 ROLLBACK ;
10967
10968 END IF ;
10969
10970 EXCEPTION
10971 WHEN OTHERS THEN
10972 -- Since the Def Validation Process is kind of
10973 -- just place folder for customization, we will not handle
10974 -- any exception here
10975 NULL ;
10976
10977 END ;
10978
10979
10980 EXCEPTION
10981 WHEN OTHERS THEN
10982
10983 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
10984
10985 IF FND_MSG_PUB.Check_Msg_Level
10986 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
10987 THEN
10988 FND_MSG_PUB.Add_Exc_Msg
10989 ( G_PKG_NAME
10990 , l_api_name
10991 );
10992 END IF;
10993
10994 END StartValidateDefProcess ;
10995
10996
10997
10998 FUNCTION ConvertRouteStatusToActionType
10999 ( p_route_status_code IN VARCHAR2
11000 , p_convert_type IN VARCHAR2 := 'RESPONSE' -- 'RESPONSE' or 'WF_PROCESS'
11001 )
11002 RETURN VARCHAR2
11003 IS
11004
11005 l_action_type VARCHAR2(30) ;
11006
11007
11008 BEGIN
11009
11010 IF p_convert_type = 'RESPONSE' THEN
11011
11012 -- Convert Route Status to Action Type for User Response in Route
11013 IF p_route_status_code = Eng_Workflow_Util.G_RT_APPROVED
11014 THEN
11015
11016 l_action_type := Eng_Workflow_Util.G_ACT_APPROVED ;
11017
11018 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_REJECTED
11019 THEN
11020
11021 l_action_type := Eng_Workflow_Util.G_ACT_REJECTED ;
11022
11023 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_COMPLETED
11024 THEN
11025
11026 l_action_type := Eng_Workflow_Util.G_ACT_COMPLETED ;
11027
11028 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_REPLIED
11029 THEN
11030
11031 l_action_type := Eng_Workflow_Util.G_ACT_REPLIED;
11032
11033
11034 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_TIME_OUT
11035 THEN
11036
11037 l_action_type := Eng_Workflow_Util.G_ACT_TIMEOUT_WF;
11038
11039 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_FORWARDED
11040 THEN
11041
11042 l_action_type := Eng_Workflow_Util.G_ACT_DELEGATED;
11043
11044 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_TRANSFERRED
11045 THEN
11046
11047 l_action_type := Eng_Workflow_Util.G_ACT_TRANSFERRED;
11048
11049
11050 -- R12B
11051 -- Added for Line Workflow Request Response
11052 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_RECEIVED
11053 THEN
11054
11055 l_action_type := Eng_Workflow_Util.G_ACT_RECEIVED;
11056
11057 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_DECLINED
11058 THEN
11059
11060 l_action_type := Eng_Workflow_Util.G_ACT_DECLINED;
11061
11062
11063 ELSE
11064
11065 l_action_type := Eng_Workflow_Util.G_ACT_COMPLETED ;
11066 END IF ;
11067
11068 ELSIF p_convert_type = 'WF_PROCESS' THEN
11069 -- Convert Route Status to Action Type for Workflow Process Status
11070
11071 IF p_route_status_code = Eng_Workflow_Util.G_RT_IN_PROGRESS
11072 THEN
11073
11074 l_action_type := Eng_Workflow_Util.G_ACT_WF_STARTED;
11075
11076 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_APPROVED
11077 THEN
11078
11079 l_action_type := Eng_Workflow_Util.G_ACT_WF_APPROVED ;
11080
11081
11082 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_REJECTED
11083 THEN
11084
11085 l_action_type := Eng_Workflow_Util.G_ACT_WF_REJECTED;
11086
11087 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_COMPLETED
11088 THEN
11089
11090 l_action_type := Eng_Workflow_Util.G_ACT_WF_COMPLETED;
11091
11092 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_ABORTED
11093 THEN
11094
11095 l_action_type := Eng_Workflow_Util.G_ACT_WF_ABORTED;
11096
11097
11098 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_TIME_OUT
11099 THEN
11100
11101 l_action_type := Eng_Workflow_Util.G_ACT_WF_TIME_OUT;
11102
11103 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_ERROR -- Not Stupported yet
11104 THEN
11105
11106 l_action_type := Eng_Workflow_Util.G_ACT_WF_PROCESS_ERROR ;
11107
11108 ELSE
11109
11110 l_action_type := Eng_Workflow_Util.G_ACT_WF_COMPLETED ;
11111
11112 END IF ;
11113
11114 END IF ;
11115
11116 RETURN l_action_type ;
11117
11118 END ConvertRouteStatusToActionType ;
11119
11120
11121
11122 FUNCTION ConvNtfWFStatToDistLNStat
11123 ( p_route_status_code IN VARCHAR2
11124 , p_convert_type IN VARCHAR2 := NULL -- Future use, 'WF_PROCESS'
11125 )
11126 RETURN VARCHAR2
11127 IS
11128
11129 l_dist_line_status_code VARCHAR2(30) ;
11130
11131 BEGIN
11132
11133 -- Convert Notification Line Route Status to Distribution Line Status
11134 IF p_route_status_code = Eng_Workflow_Util.G_RT_IN_PROGRESS
11135 THEN
11136
11137 l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_DIST_IN_PROGRESS;
11138
11139 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_APPROVED
11140 THEN
11141
11142 l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_DISTRIBUTED ;
11143
11144
11145 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_REJECTED
11146 THEN
11147
11148 l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_NOT_DISTRIBUTED;
11149
11150 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_COMPLETED
11151 THEN
11152
11153 l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_DISTRIBUTED;
11154
11155 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_ABORTED
11156 THEN
11157
11158 l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_NOT_DISTRIBUTED;
11159
11160
11161 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_TIME_OUT
11162 THEN
11163
11164 l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_NOT_DISTRIBUTED;
11165
11166 ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_ERROR -- Not Stupported yet
11167 THEN
11168
11169 l_dist_line_status_code := Eng_Workflow_Util.G_ACT_WF_PROCESS_ERROR ;
11170
11171 ELSE
11172
11173 l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_NOT_DISTRIBUTED ;
11174
11175 END IF ;
11176
11177 RETURN l_dist_line_status_code ;
11178
11179
11180 END ConvNtfWFStatToDistLNStat ;
11181
11182
11183
11184 PROCEDURE RespondToActReqCommentFromUI
11185 ( x_return_status OUT NOCOPY VARCHAR2
11186 , x_msg_count OUT NOCOPY NUMBER
11187 , x_msg_data OUT NOCOPY VARCHAR2
11188 , x_processed_ntf_id OUT NOCOPY NUMBER
11189 , p_item_type IN VARCHAR2
11190 , p_item_key IN VARCHAR2
11191 , p_responder IN VARCHAR2
11192 , p_response_comment IN VARCHAR2 := NULL
11193 , p_action_source IN VARCHAR2 := NULL
11194 )
11195 IS
11196
11197 l_api_name CONSTANT VARCHAR2(30) := 'RespondToActReqCommentFromUI';
11198
11199 CURSOR c_ntf_info (p_item_type VARCHAR2
11200 , p_item_key VARCHAR2
11201 , p_responder VARCHAR2)
11202 IS
11203
11204 SELECT ntf.NOTIFICATION_ID,
11205 ntf.RECIPIENT_ROLE,
11206 ntf.MESSAGE_NAME,
11207 ntf.message_type
11208 FROM WF_ITEM_ACTIVITY_STATUSES wias,
11209 WF_NOTIFICATIONS ntf
11210 WHERE ntf.STATUS = 'OPEN'
11211 AND wias.NOTIFICATION_ID = ntf.group_id
11212 AND wias.NOTIFICATION_ID IS NOT NULL
11213 AND (wias.ACTIVITY_STATUS = 'NOTIFIED' OR wias.ACTIVITY_STATUS = 'ERROR')
11214 AND wias.ITEM_TYPE = p_item_type
11215 AND wias.ITEM_KEY = p_item_key
11216 AND ntf.RECIPIENT_ROLE = p_responder
11217 AND EXISTS (SELECT 1
11218 FROM WF_NOTIFICATION_ATTRIBUTES na,
11219 WF_MESSAGE_ATTRIBUTES ma
11220 WHERE na.NOTIFICATION_ID = ntf.NOTIFICATION_ID
11221 AND ma.MESSAGE_NAME = ntf.MESSAGE_NAME
11222 AND ma.MESSAGE_TYPE = ntf.MESSAGE_TYPE
11223 AND ma.NAME = na.NAME
11224 AND ma.SUBTYPE = 'RESPOND') ;
11225
11226
11227 BEGIN
11228
11229 -- Initialize API return status to success
11230 x_return_status := FND_API.G_RET_STS_SUCCESS;
11231
11232 IF g_debug_flag THEN
11233 Write_Debug('Eng_Workflow_Util.RespondToActReqCommentFromUI Log');
11234 Write_Debug('-----------------------------------------------------');
11235 Write_Debug('Item Type : ' || p_item_type );
11236 Write_Debug('Item Key : ' || p_item_key );
11237 Write_Debug('Responder : ' || p_responder );
11238 Write_Debug('Response Comment : ' || p_response_comment );
11239 Write_Debug('-----------------------------------------------------');
11240 END IF ;
11241
11242 -- Init processed_ntf_id
11243 x_processed_ntf_id := 0 ;
11244
11245 -- Get the corresponding ntf Id for this workflow and responder
11246 -- At this time, we are not checking message name and message
11247 -- type cause cutomer may create a cutom message
11248 -- If customer customizes action request comment workflow process
11249 -- there is small chance this logic does not work
11250 FOR ntf_info_rec IN c_ntf_info (p_item_type => p_item_type
11251 , p_item_key => p_item_key
11252 , p_responder => p_responder)
11253 LOOP
11254 x_processed_ntf_id := ntf_info_rec.NOTIFICATION_ID ;
11255 END LOOP ;
11256
11257 IF g_debug_flag THEN
11258 Write_Debug('Notification Id : ' || TO_CHAR(x_processed_ntf_id));
11259 END IF ;
11260
11261
11262 IF g_debug_flag THEN
11263 Write_Debug('Calling WF_NOTIFICATION.SetAttrText for RESULT' );
11264 END IF ;
11265
11266
11267 IF x_processed_ntf_id IS NOT NULL AND x_processed_ntf_id > 0
11268 THEN
11269 WF_NOTIFICATION.SetAttrText
11270 ( nid => x_processed_ntf_id
11271 , aname => 'RESULT'
11272 , avalue => G_REPLY
11273 );
11274
11275 IF g_debug_flag THEN
11276 Write_Debug('Calling WF_NOTIFICATION.SetAttrText for WF_NOTE' );
11277 END IF ;
11278
11279 WF_NOTIFICATION.SetAttrText
11280 ( nid => x_processed_ntf_id
11281 , aname => 'WF_NOTE'
11282 , avalue=> p_response_comment) ;
11283
11284 IF g_debug_flag THEN
11285 Write_Debug('Calling WF_NOTIFICATION.RESPOND' );
11286 END IF ;
11287
11288 WF_NOTIFICATION.RESPOND
11289 ( nid => x_processed_ntf_id -- nid in number
11290 , responder => p_responder -- responder in varchar2 default null
11291 ) ;
11292
11293 END IF ;
11294
11295
11296 EXCEPTION
11297 WHEN OTHERS THEN
11298
11299 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
11300
11301 IF FND_MSG_PUB.Check_Msg_Level
11302 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
11303 THEN
11304 FND_MSG_PUB.Add_Exc_Msg
11305 ( G_PKG_NAME
11306 , l_api_name
11307 );
11308 END IF;
11309
11310
11311 END RespondToActReqCommentFromUI ;
11312
11313
11314
11315 --
11316 -- Bug5136260
11317 -- API name : SetChangeOrderMRPFlag
11318 -- Type : Private
11319 -- Pre-reqs : None.
11320 -- Function : Set Change Order's Revised Item MFP Flag to then given mrp_flag
11321 -- if a revised item is in Status=Draft, Open,Approval, Scheduled, Released
11322 -- Parameters :p_change_id IN NUMBER Change Id
11323 -- p_mrp_flag IN NUMBER 1: Yes G_MRP_FLAG_YES
11324 -- 2: No G_MRP_FLAG_NO
11325 -- p_api_caller IN VARCHAR2 := NULL -- or G_WF_CALL:'WF'
11326 -- x_msg_count OUT NUMBER
11327 -- x_msg_data OUT VARCHAR2
11328 -- x_return_status OUT VARCHAR2
11329 --
11330 PROCEDURE SetChangeOrderMRPFlag
11331 ( x_return_status OUT NOCOPY VARCHAR2
11332 , x_msg_count OUT NOCOPY NUMBER
11333 , x_msg_data OUT NOCOPY VARCHAR2
11334 , p_change_id IN NUMBER
11335 , p_mrp_flag IN NUMBER
11336 , p_wf_user_id IN NUMBER := NULL
11337 , p_api_caller IN VARCHAR2 := NULL -- or G_WF_CALL:'WF'
11338 )
11339 IS
11340
11341 l_api_name CONSTANT VARCHAR2(30) := 'SetChangeOrderMRPFlag';
11342
11343 l_fnd_user_id NUMBER ;
11344 l_fnd_login_id NUMBER ;
11345 l_base_cm_type_code VARCHAR2(30) ;
11346
11347 BEGIN
11348
11349
11350 -- Initialize API return status to success
11351 x_return_status := FND_API.G_RET_STS_SUCCESS;
11352
11353 IF g_debug_flag THEN
11354 Write_Debug('Eng_Workflow_Util.SetChangeOrderMRPFlag Log');
11355 Write_Debug('-----------------------------------------------------');
11356 Write_Debug('Change Id : ' || to_char(p_change_id) );
11357 Write_Debug('MFP Flag : ' || to_char(p_change_id) );
11358 Write_Debug('WF User Id : ' || to_char(p_wf_user_id) );
11359 Write_Debug('API Caller : ' || p_api_caller );
11360 Write_Debug('-----------------------------------------------------');
11361 END IF ;
11362
11363
11364 -- Check if this Change Object is Chagne Order by base cm type code
11365 l_base_cm_type_code := GetBaseChangeMgmtTypeCode(p_change_id) ;
11366
11367 IF l_base_cm_type_code = 'CHANGE_ORDER'
11368 THEN
11369
11370 IF g_debug_flag THEN
11371 Write_Debug('Change Object is Change Order');
11372 END IF ;
11373
11374 l_fnd_user_id := TO_NUMBER(FND_PROFILE.VALUE('USER_ID'));
11375 l_fnd_login_id := TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID'));
11376
11377 -- FND_PROFILE package is not available for workflow (WF),
11378 -- therefore manually set WHO column values
11379 IF p_api_caller = 'WF'
11380 THEN
11381 l_fnd_user_id := p_wf_user_id ;
11382 l_fnd_login_id := '' ;
11383 END IF;
11384
11385 -- Put dummy fnd user id if it's still null
11386 IF l_fnd_user_id IS NULL
11387 THEN
11388 l_fnd_user_id := -10000;
11389 END IF ;
11390
11391 UPDATE eng_revised_items
11392 SET mrp_active = p_mrp_flag
11393 , last_update_date = SYSDATE
11394 , last_updated_by = l_fnd_user_id
11395 , last_update_login = l_fnd_login_id
11396 WHERE change_id = p_change_id
11397 AND status_type in (0, 1, 4, 7, 8) ;
11398
11399 IF g_debug_flag THEN
11400 Write_Debug('After updating mrp flag in revised teims');
11401 END IF ;
11402
11403 END IF ; -- Base CM Code is Change Order
11404
11405
11406 EXCEPTION
11407 WHEN OTHERS THEN
11408
11409 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
11410
11411 IF FND_MSG_PUB.Check_Msg_Level
11412 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
11413 THEN
11414 FND_MSG_PUB.Add_Exc_Msg
11415 ( G_PKG_NAME
11416 , l_api_name
11417 );
11418 END IF;
11419
11420
11421 END SetChangeOrderMRPFlag ;
11422
11423
11424 /********************************************************************
11425 * API Type : Public APIs
11426 * Purpose : Those APIs are public
11427 *********************************************************************/
11428 PROCEDURE GetWorkflowMonitorURL
11429 ( p_api_version IN NUMBER
11430 , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
11431 , p_commit IN VARCHAR2 := FND_API.G_FALSE
11432 , p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL
11433 , x_return_status OUT NOCOPY VARCHAR2
11434 , x_msg_count OUT NOCOPY NUMBER
11435 , x_msg_data OUT NOCOPY VARCHAR2
11436 , p_item_type IN VARCHAR2
11437 , p_item_key IN VARCHAR2
11438 , p_url_type IN VARCHAR2 := Eng_Workflow_Util.G_MONITOR_DIAGRAM
11439 , p_admin_mode IN VARCHAR2 := FND_API.G_FALSE
11440 , p_option IN VARCHAR2 := NULL
11441 , x_url OUT NOCOPY VARCHAR2
11442 )
11443 IS
11444
11445 l_api_name CONSTANT VARCHAR2(30) := 'GetWorkflowMonitorURL';
11446 l_api_version CONSTANT NUMBER := 1.0;
11447 l_YES CONSTANT VARCHAR2(3) := 'YES';
11448 l_NO CONSTANT VARCHAR2(3) := 'NO';
11449 l_admin_mode VARCHAR2(3) ;
11450 l_apps_web_agent VARCHAR2(240) ;
11451 l_wf_web_agent VARCHAR2(2000) ;
11452
11453 BEGIN
11454 -- Standard Start of API savepoint
11455 -- No Need to set SAVEPOINT for this API
11456 -- SAVEPOINT GetWorkflowMonitorURL_Util ;
11457
11458 -- Standard call to check for call compatibility.
11459 IF NOT FND_API.Compatible_API_Call( l_api_version
11460 , p_api_version
11461 , l_api_name
11462 , G_PKG_NAME )
11463 THEN
11464 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11465 END IF;
11466
11467
11468 -- Initialize message list if p_init_msg_list is set to TRUE.
11469 IF FND_API.to_Boolean( p_init_msg_list ) THEN
11470 FND_MSG_PUB.initialize;
11471 END IF ;
11472
11473 -- Initialize API return status to success
11474 x_return_status := FND_API.G_RET_STS_SUCCESS;
11475
11476
11477 -- API body
11478
11479 -- Get Admin Mode.
11480 IF FND_API.to_Boolean( p_admin_mode ) THEN
11481 l_admin_mode := l_YES ;
11482 ELSE
11483 l_admin_mode := l_NO ;
11484 END IF ;
11485
11486 -- Get Web Agent
11487 l_apps_web_agent := fnd_web_config.plsql_agent(help_mode => 'APPS') ;
11488 l_wf_web_agent := WF_CORE.Translate('WF_WEB_AGENT') ;
11489
11490
11491
11492 IF p_url_type = Eng_Workflow_Util.G_MONITOR_ACCESSKEY
11493 THEN
11494
11495 x_url := WF_MONITOR.GetAccessKey
11496 ( x_item_type => p_item_type
11497 , x_item_key => p_item_key
11498 , x_admin_mode => l_admin_mode ) ;
11499
11500 ELSIF p_url_type = Eng_Workflow_Util.G_MONITOR_DIAGRAM
11501 THEN
11502
11503 x_url := WF_MONITOR.GetDiagramURL
11504 ( x_agent => l_apps_web_agent
11505 , x_item_type => p_item_type
11506 , x_item_key => p_item_key
11507 , x_admin_mode => l_admin_mode ) ;
11508
11509 ELSIF p_url_type = Eng_Workflow_Util.G_MONITOR_ENVELOPE
11510 THEN
11511
11512 x_url := WF_MONITOR.GetEnvelopeURL
11513 ( x_agent => l_apps_web_agent
11514 , x_item_type => p_item_type
11515 , x_item_key => p_item_key
11516 , x_admin_mode => l_admin_mode ) ;
11517
11518
11519 ELSIF p_url_type = Eng_Workflow_Util.G_MONITOR_ADVANCED_ENVELOPE
11520 THEN
11521
11522 x_url := WF_MONITOR.GetAdvancedEnvelopeURL
11523 ( x_agent => l_apps_web_agent
11524 , x_item_type => p_item_type
11525 , x_item_key => p_item_key
11526 , x_admin_mode => l_admin_mode
11527 , x_options => p_option ) ;
11528
11529
11530 END IF ;
11531
11532
11533 -- Standard check of p_commit.
11534 -- IF FND_API.To_Boolean( p_commit ) THEN
11535 -- COMMIT WORK;
11536 -- END IF;
11537
11538 -- Standard call to get message count and if count is 1, get message info.
11539 FND_MSG_PUB.Count_And_Get
11540 ( p_count => x_msg_count
11541 , p_data => x_msg_data
11542 );
11543
11544 EXCEPTION
11545 WHEN FND_API.G_EXC_ERROR THEN
11546 -- ROLLBACK TO GetWorkflowMonitorURL_Util ;
11547 x_return_status := FND_API.G_RET_STS_ERROR ;
11548
11549 FND_MSG_PUB.Count_And_Get
11550 ( p_count => x_msg_count
11551 , p_data => x_msg_data
11552 );
11553
11554 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
11555 -- ROLLBACK TO GetWorkflowMonitorURL_Util ;
11556 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
11557
11558 FND_MSG_PUB.Count_And_Get
11559 ( p_count => x_msg_count
11560 , p_data => x_msg_data
11561 );
11562
11563 WHEN OTHERS THEN
11564 -- ROLLBACK TO GetWorkflowMonitorURL_Util ;
11565 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
11566
11567 FND_MSG_PUB.Count_And_Get
11568 ( p_count => x_msg_count
11569 , p_data => x_msg_data
11570 );
11571
11572 IF FND_MSG_PUB.Check_Msg_Level
11573 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
11574 THEN
11575 FND_MSG_PUB.Add_Exc_Msg
11576 ( G_PKG_NAME
11577 , l_api_name
11578 );
11579 END IF;
11580
11581 FND_MSG_PUB.Count_And_Get
11582 ( p_count => x_msg_count
11583 , p_data => x_msg_data
11584 );
11585
11586 END GetWorkflowMonitorURL ;
11587
11588
11589
11590 PROCEDURE StartWorkflow
11591 ( p_api_version IN NUMBER
11592 , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
11593 , p_commit IN VARCHAR2 := FND_API.G_FALSE
11594 , p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL
11595 , x_return_status OUT NOCOPY VARCHAR2
11596 , x_msg_count OUT NOCOPY NUMBER
11597 , x_msg_data OUT NOCOPY VARCHAR2
11598 , p_item_type IN VARCHAR2
11599 , x_item_key IN OUT NOCOPY VARCHAR2
11600 , p_process_name IN VARCHAR2
11601 , p_change_id IN NUMBER := NULL
11602 , p_change_line_id IN NUMBER := NULL
11603 , p_wf_user_id IN NUMBER
11604 , p_host_url IN VARCHAR2 := NULL
11605 , p_action_id IN NUMBER := NULL
11606 , p_adhoc_party_list IN VARCHAR2 := NULL
11607 , p_route_id IN NUMBER := NULL
11608 , p_route_step_id IN NUMBER := NULL
11609 , p_parent_item_type IN VARCHAR2 := NULL
11610 , p_parent_item_key IN VARCHAR2 := NULL
11611 , p_debug IN VARCHAR2 := FND_API.G_FALSE
11612 , p_output_dir IN VARCHAR2 := NULL
11613 , p_debug_filename IN VARCHAR2 := 'Eng_ChangeWF_Start.log'
11614 )
11615 IS
11616
11617 l_object_name VARCHAR2(30) ;
11618 l_object_id1 NUMBER ;
11619 l_parent_object_name VARCHAR2(30) ;
11620 l_parent_object_id1 NUMBER ;
11621
11622 BEGIN
11623
11624
11625 IF p_change_line_id IS NOT NULL AND p_change_line_id > 0
11626 THEN
11627 l_object_name := G_ENG_CHANGE_LINE ;
11628 l_object_id1 := p_change_line_id ;
11629 l_parent_object_name := G_ENG_CHANGE ;
11630
11631 IF p_change_id IS NOT NULL AND p_change_id > 0
11632 THEN
11633
11634 l_parent_object_id1 := p_change_id ;
11635
11636 ELSE
11637 l_parent_object_id1 := GetParentChangeId(p_change_line_id => p_change_line_id);
11638 END IF ;
11639
11640 ELSE
11641
11642 l_object_name := G_ENG_CHANGE ;
11643 l_object_id1 := p_change_id ;
11644
11645 END IF ;
11646
11647
11648 StartWorkflow
11649 ( p_api_version => p_api_version
11650 , p_init_msg_list => p_init_msg_list
11651 , p_commit => p_commit
11652 , p_validation_level => p_validation_level
11653 , x_return_status => x_return_status
11654 , x_msg_count => x_msg_count
11655 , x_msg_data => x_msg_data
11656 , p_item_type => p_item_type
11657 , x_item_key => x_item_key
11658 , p_process_name => p_process_name
11659 , p_object_name => l_object_name
11660 , p_object_id1 => l_object_id1
11661 , p_object_id2 => NULL
11662 , p_object_id3 => NULL
11663 , p_object_id4 => NULL
11664 , p_object_id5 => NULL
11665 , p_parent_object_name => l_parent_object_name
11666 , p_parent_object_id1 => l_parent_object_id1
11667 , p_wf_user_id => p_wf_user_id
11668 , p_host_url => p_host_url
11669 , p_action_id => p_action_id
11670 , p_adhoc_party_list => p_adhoc_party_list
11671 , p_route_id => p_route_id
11672 , p_route_step_id => p_route_step_id
11673 , p_parent_item_type => p_parent_item_type
11674 , p_parent_item_key => p_parent_item_key
11675 , p_debug => p_debug
11676 , p_output_dir => p_output_dir
11677 , p_debug_filename => p_debug_filename
11678 ) ;
11679
11680
11681 END StartWorkflow ;
11682
11683
11684 PROCEDURE StartWorkflow
11685 ( p_api_version IN NUMBER
11686 , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
11687 , p_commit IN VARCHAR2 := FND_API.G_FALSE
11688 , p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL
11689 , x_return_status OUT NOCOPY VARCHAR2
11690 , x_msg_count OUT NOCOPY NUMBER
11691 , x_msg_data OUT NOCOPY VARCHAR2
11692 , p_item_type IN VARCHAR2
11693 , x_item_key IN OUT NOCOPY VARCHAR2
11694 , p_process_name IN VARCHAR2
11695 , p_object_name IN VARCHAR2
11696 , p_object_id1 IN NUMBER
11697 , p_object_id2 IN NUMBER := NULL
11698 , p_object_id3 IN NUMBER := NULL
11699 , p_object_id4 IN NUMBER := NULL
11700 , p_object_id5 IN NUMBER := NULL
11701 , p_parent_object_name IN VARCHAR2 := NULL
11702 , p_parent_object_id1 IN NUMBER := NULL
11703 , p_wf_user_id IN NUMBER
11704 , p_host_url IN VARCHAR2 := NULL
11705 , p_action_id IN NUMBER := NULL
11706 , p_adhoc_party_list IN VARCHAR2 := NULL
11707 , p_route_id IN NUMBER := NULL
11708 , p_route_step_id IN NUMBER := NULL
11709 , p_parent_item_type IN VARCHAR2 := NULL
11710 , p_parent_item_key IN VARCHAR2 := NULL
11711 , p_debug IN VARCHAR2 := FND_API.G_FALSE
11712 , p_output_dir IN VARCHAR2 := NULL
11713 , p_debug_filename IN VARCHAR2 := 'Eng_ChangeWF_Start.log'
11714 )
11715 IS
11716
11717 l_api_name CONSTANT VARCHAR2(30) := 'StartWorkflow';
11718 l_api_version CONSTANT NUMBER := 1.0;
11719
11720 l_wf_user_role VARCHAR2(320) ;
11721 l_wf_user_key VARCHAR2(240) ;
11722
11723 l_change_id NUMBER ;
11724 l_change_line_id NUMBER ;
11725
11726 l_action_id NUMBER ;
11727 l_action_type VARCHAR2(30) ;
11728 l_api_caller VARCHAR2(30) ;
11729
11730
11731 -- R12B for Grants
11732 l_return_status VARCHAR2(1);
11733 l_msg_count NUMBER;
11734 l_msg_data VARCHAR2(3000);
11735
11736 l_target_obj_tbl FND_TABLE_OF_VARCHAR2_30;
11737 l_index PLS_INTEGER ;
11738
11739
11740
11741 BEGIN
11742 -- Standard Start of API savepoint
11743 SAVEPOINT StartWorkflow_Util;
11744
11745 -- Standard call to check for call compatibility.
11746 IF NOT FND_API.Compatible_API_Call( l_api_version
11747 , p_api_version
11748 , l_api_name
11749 , G_PKG_NAME )
11750 THEN
11751 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11752 END IF;
11753
11754 -- Initialize message list if p_init_msg_list is set to TRUE.
11755 IF FND_API.to_Boolean( p_init_msg_list ) THEN
11756 FND_MSG_PUB.initialize;
11757 END IF ;
11758
11759
11760
11761 -- For Test/Debug
11762 Check_And_Open_Debug_Session(p_debug, p_output_dir, p_debug_filename) ;
11763 -- R12 Comment out
11764 -- IF FND_API.to_Boolean( p_debug ) THEN
11765 -- Open_Debug_Session(p_output_dir, p_debug_filename ) ;
11766 -- END IF;
11767
11768 -- Initialize Other Variables
11769 IF p_object_name = G_ENG_CHANGE
11770 THEN
11771
11772 l_change_id := p_object_id1 ;
11773
11774 ELSIF p_object_name = G_ENG_CHANGE_LINE
11775 THEN
11776
11777 l_change_line_id := p_object_id1 ;
11778 l_change_id := p_parent_object_id1 ;
11779
11780 END IF ;
11781
11782 IF p_action_id IS NULL THEN
11783 l_action_id := 0 ;
11784 ELSE
11785 l_action_id := p_action_id ;
11786 END IF ;
11787
11788 IF g_debug_flag THEN
11789 Write_Debug('Eng_Workflow_Util.StartWorkflow Log');
11790 Write_Debug('-----------------------------------------------------');
11791 Write_Debug('Item Type : ' || p_item_type );
11792 Write_Debug('Item Key : ' || x_item_key );
11793 Write_Debug('Process Name : ' || p_process_name);
11794 Write_Debug('Object Name : ' || p_object_name );
11795 Write_Debug('Object Id1 : ' || to_char(p_object_id1));
11796 Write_Debug('Change Id : ' || to_char(l_change_id));
11797 Write_Debug('Change Line Id : ' || to_char(l_change_line_id));
11798 Write_Debug('Host URL : ' || p_host_url);
11799 Write_Debug('WF User Id : ' || to_char(p_wf_user_id));
11800 Write_Debug('Action Id : ' || to_char(p_action_id));
11801 Write_Debug('Adhoc Party List : ' || p_adhoc_party_list);
11802 Write_Debug('Route Id : ' || to_char(p_route_id));
11803 Write_Debug('Route Step Id : ' || to_char(p_route_step_id));
11804 Write_Debug('-----------------------------------------------------');
11805 Write_Debug('Initialize return status ' );
11806 END IF ;
11807
11808 -- Initialize API return status to success
11809 x_return_status := FND_API.G_RET_STS_SUCCESS;
11810
11811 -----------------------------------------------------------------
11812 -- API body
11813 -----------------------------------------------------------------
11814 -- 1. ValidateWorkflowProcess:
11815 -- 2. CreateProcess:
11816 -- 2-1. SetItemUserKey:
11817 -- 2-2. SetItemOwner:
11818 -- 3. SetItemAttribute:
11819 -- 4. SetItemParent:
11820 -- 4-1. Additional Set
11821 -- 5. Execute Custom Hook:
11822 -- 6. StartProcess:
11823
11824 IF g_debug_flag THEN
11825 Write_Debug('1. ValidateProcess. . .');
11826 END IF ;
11827
11828 -- Call ValiadteWFProcess
11829 -- ValidateProcess
11830 ValidateProcess
11831 ( p_validation_level => p_validation_level
11832 , x_return_status => x_return_status
11833 , x_msg_count => x_msg_count
11834 , x_msg_data => x_msg_data
11835 , p_item_type => p_item_type
11836 , p_process_name => p_process_name
11837 , p_change_id => l_change_id
11838 , p_change_line_id => l_change_line_id
11839 , p_wf_user_id => p_wf_user_id
11840 , p_host_url => p_host_url
11841 , p_action_id => p_action_id
11842 , p_adhoc_party_list => p_adhoc_party_list
11843 , p_route_id => p_route_id
11844 , p_route_step_id => p_route_step_id
11845 , p_parent_item_type => p_parent_item_type
11846 , p_parent_item_key => p_parent_item_key
11847 , p_object_name => p_object_name
11848 , p_object_id1 => p_object_id1
11849 , p_object_id2 => p_object_id2
11850 , p_object_id3 => p_object_id3
11851 , p_object_id4 => p_object_id4
11852 , p_object_id5 => p_object_id5
11853 , p_parent_object_name => p_parent_object_name
11854 , p_parent_object_id1 => p_parent_object_id1
11855 ) ;
11856
11857
11858 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
11859 THEN
11860 RAISE FND_API.G_EXC_ERROR ;
11861 END IF ;
11862
11863
11864 --
11865 -- R12B
11866 -- Check WF availability for Document LC Change Object
11867 --
11868 IF g_debug_flag THEN
11869 Write_Debug('Document LC Change Object check. WF should not be started except Doc LC Phase WF. . .');
11870 END IF ;
11871
11872 IF l_change_id IS NOT NULL AND l_change_id > 0
11873 THEN
11874
11875 IF ( p_item_type <> G_CHANGE_ROUTE_ITEM_TYPE
11876 AND p_item_type <> G_CHANGE_ROUTE_DOC_STEP_TYPE
11877 AND ENG_DOCUMENT_UTIL.Is_Dom_Document_Lifecycle( p_change_id => l_change_id)
11878 )
11879 THEN
11880
11881 IF p_item_type = G_CHANGE_ACTION_ITEM_TYPE
11882 THEN
11883
11884 IF g_debug_flag THEN
11885 Write_Debug('CM Workflows except Doc Phse WF Routing are not supported in Document LC ChangeObject. return. .. ');
11886 END IF ;
11887 -- At this time, not raising any error
11888 -- Set dummy item key
11889 x_item_key := Eng_Workflow_Util.G_RET_STS_NONE ;
11890 RETURN ;
11891
11892 ELSE
11893
11894 IF g_debug_flag THEN
11895 Write_Debug('CM Workflows except Doc Phse WF Routing are not supported in Document LC ChangeObject. Raise Error. .. ');
11896 END IF ;
11897 -- At this time, not raising any error
11898
11899 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
11900 END IF ;
11901
11902
11903 END IF ;
11904
11905 END IF ;
11906
11907
11908 IF g_debug_flag THEN
11909 Write_Debug('2. CreateProcess. . .');
11910 END IF ;
11911
11912
11913 IF x_item_key IS NULL THEN
11914
11915 -- Get new item key
11916 x_item_key := GetNewItemKey ;
11917
11918 END IF ;
11919
11920
11921 IF g_debug_flag THEN
11922 Write_Debug('Got new wf item key: ' || x_item_key );
11923 END IF ;
11924
11925
11926 -- We no longer use Submit Revision for Change Workflow
11927 -- Set workflow revision history
11928 -- SetWorkflowRevision
11929 -- ( p_item_type => p_item_type
11930 -- , p_item_key => x_item_key
11931 -- , p_process_name => p_process_name
11932 -- , p_change_notice => p_change_notice
11933 -- , p_organization_id => p_organization_id
11934 -- , p_wf_user_id => p_wf_user_id
11935 -- , p_action_id => p_action_id
11936 -- , p_route_id => p_route_id
11937 -- , p_route_step_id => p_route_step_id
11938 -- ) ;
11939
11940 l_wf_user_key := GetItemUserKey
11941 ( p_item_type => p_item_type
11942 , p_item_key => x_item_key
11943 , p_change_id => l_change_id
11944 , p_change_line_id => l_change_line_id
11945 , p_object_name => p_object_name
11946 , p_object_id1 => p_object_id1
11947 , p_object_id2 => p_object_id2
11948 , p_object_id3 => p_object_id3
11949 , p_object_id4 => p_object_id4
11950 , p_object_id5 => p_object_id5
11951 , p_parent_object_name => p_parent_object_name
11952 , p_parent_object_id1 => p_parent_object_id1
11953 ) ;
11954
11955
11956 IF g_debug_flag THEN
11957 Write_Debug('2-1. Set ItemUserKey. . .' || l_wf_user_key );
11958 END IF ;
11959
11960 -- Get User Info
11961 l_wf_user_role := GetUserRole(p_user_id => p_wf_user_id ) ;
11962
11963
11964 IF g_debug_flag THEN
11965 Write_Debug('2-2. Set ItemOwner. . .' || l_wf_user_role );
11966 END IF ;
11967
11968
11969 -- Set User Id
11970 IF p_wf_user_id IS NULL OR p_wf_user_id < 0
11971 THEN
11972 l_api_caller := Eng_Workflow_Util.G_WF_CALL ;
11973 END IF ;
11974
11975 IF g_debug_flag THEN
11976 Write_Debug('2-2. Get Spcial API Caller: ' || l_api_caller );
11977 END IF ;
11978
11979 -- Set Workflow Process Owner
11980 WF_ENGINE.CreateProcess
11981 ( itemtype => p_item_type
11982 , itemkey => x_item_key
11983 , process => p_process_name
11984 , user_key => l_wf_user_key
11985 , owner_role => l_wf_user_role ) ;
11986
11987
11988 IF g_debug_flag THEN
11989 Write_Debug('3. SetItemAttribute. . .');
11990 END IF ;
11991
11992 -- Set Item Attributes
11993 SetAttributes
11994 ( x_return_status => x_return_status
11995 , x_msg_count => x_msg_count
11996 , x_msg_data => x_msg_data
11997 , p_item_type => p_item_type
11998 , p_item_key => x_item_key
11999 , p_process_name => p_process_name
12000 , p_change_id => l_change_id
12001 , p_change_line_id => l_change_line_id
12002 , p_wf_user_id => p_wf_user_id
12003 , p_wf_user_role => l_wf_user_role
12004 , p_host_url => p_host_url
12005 , p_action_id => l_action_id
12006 , p_adhoc_party_list => p_adhoc_party_list
12007 , p_route_id => p_route_id
12008 , p_route_step_id => p_route_step_id
12009 , p_parent_item_type => p_parent_item_type
12010 , p_parent_item_key => p_parent_item_key
12011 , p_object_name => p_object_name
12012 , p_object_id1 => p_object_id1
12013 , p_object_id2 => p_object_id2
12014 , p_object_id3 => p_object_id3
12015 , p_object_id4 => p_object_id4
12016 , p_object_id5 => p_object_id5
12017 , p_parent_object_name => p_parent_object_name
12018 , p_parent_object_id1 => p_parent_object_id1
12019 ) ;
12020
12021
12022 IF g_debug_flag THEN
12023 Write_Debug('After SetItemAttribute. . .');
12024 Write_Debug('Change Id : ' || to_char(l_change_id));
12025 END IF ;
12026
12027
12028 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12029 THEN
12030 RAISE FND_API.G_EXC_ERROR ;
12031 END IF ;
12032
12033 IF g_debug_flag THEN
12034 Write_Debug('4. SetItemParent. . .');
12035 Write_Debug('Parent Item Type : ' || p_parent_item_type);
12036 Write_Debug('Parent Item Key : ' || p_parent_item_key);
12037 END IF ;
12038
12039 -- If Parent WF Info is not null and
12040 -- item_type is NOT Eng_Workflow_Util.G_CHANGE_ROUTE_ITEM_TYPE
12041 -- G_CHANGE_ROUTE_ITEM_TYPE has own API to set parent wf info
12042 IF p_parent_item_type IS NOT NULL
12043 AND p_parent_item_key IS NOT NULL
12044 AND p_item_type <> Eng_Workflow_Util.G_CHANGE_ROUTE_ITEM_TYPE
12045 THEN
12046
12047 -- Set Parent Worklfow Process
12048 WF_ENGINE.SetItemParent
12049 ( itemtype => p_item_type
12050 , itemkey => x_item_key
12051 , parent_itemtype => p_parent_item_type
12052 , parent_itemkey => p_parent_item_key
12053 , parent_context => NULL
12054 );
12055
12056 END IF ;
12057
12058
12059 IF p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_ITEM_TYPE
12060 THEN
12061
12062 IF g_debug_flag THEN
12063 Write_Debug('4-2. Set Route Status . . .');
12064 END IF ;
12065
12066 SetRouteStatus
12067 ( p_item_type => p_item_type
12068 , p_item_key => x_item_key
12069 , p_wf_user_id => p_wf_user_id
12070 , p_route_id => p_route_id
12071 , p_new_status_code => Eng_Workflow_Util.G_RT_IN_PROGRESS
12072 , p_init_route => FND_API.G_TRUE
12073 , p_change_id => l_change_id
12074 , p_change_line_id => l_change_line_id -- Added in R12B
12075 ) ;
12076
12077
12078 -- In case that Route Object is Change Object
12079 IF p_object_name = Eng_Workflow_Util.G_ENG_CHANGE
12080 THEN
12081
12082 /***********************************************
12083 --
12084 -- In 115.10
12085 -- Workflow Routing will not chagne Change Object
12086 -- Approval Status
12087 -- IF g_debug_flag THEN
12088 -- Write_Debug('4-3. Set Approval Route Status . . .');
12089 -- END IF ;
12090 --
12091 -- SetChangeApprovalStatus
12092 -- ( x_return_status => x_return_status
12093 -- , x_msg_count => x_msg_count
12094 -- , x_msg_data => x_msg_data
12095 -- , p_item_type => p_item_type
12096 -- , p_item_key => x_item_key
12097 -- , p_change_id => l_change_id
12098 -- , p_change_line_id => l_change_line_id
12099 -- , p_wf_user_id => p_wf_user_id
12100 -- , p_new_appr_status_type => Eng_Workflow_Util.G_REQUESTED
12101 -- ) ;
12102 --
12103
12104 -- IF g_debug_flag THEN
12105 -- Write_Debug('After Set Approval Status .' || x_return_status );
12106 -- END IF ;
12107
12108 -- IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12109 -- THEN
12110 -- RAISE FND_API.G_EXC_ERROR ;
12111 -- END IF ;
12112 --
12113 ****************************************************/
12114
12115
12116 IF g_debug_flag THEN
12117 Write_Debug('4-4. Set 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 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 IF g_debug_flag THEN
12154 Write_Debug('4-5. Sync Workflow Routing Status and LC Phase WF Status. . .');
12155 END IF ;
12156
12157 -- R12B
12158 -- No need to call Eng_Workflow_Util.SyncChangeLCPhase
12159 -- For Line
12160 IF ( l_change_line_id IS NULL OR l_change_line_id <= 0)
12161 THEN
12162
12163 -- Call Sync Change Lifecycle Phase API
12164 Eng_Workflow_Util.SyncChangeLCPhase
12165 ( x_return_status => x_return_status
12166 , x_msg_count => x_msg_count
12167 , x_msg_data => x_msg_data
12168 , p_route_id => p_route_id
12169 , p_api_caller => l_api_caller
12170 ) ;
12171
12172
12173 IF g_debug_flag THEN
12174 Write_Debug('After Sync Workflow Routing Status and LC Phase WF Status.' || x_return_status );
12175 END IF ;
12176
12177
12178 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12179 THEN
12180 RAISE FND_API.G_EXC_ERROR ;
12181 END IF ;
12182
12183 END IF ;
12184
12185
12186 -- R12B Line Workfow Routing
12187 -- In case that Route Object is Change Line Object
12188 ELSIF p_object_name = Eng_Workflow_Util.G_ENG_CHANGE_LINE
12189 THEN
12190
12191
12192 IF g_debug_flag THEN
12193 Write_Debug('4-4. Set Line Workflow Routing Action Log . . .');
12194 END IF ;
12195 l_action_type := Eng_Workflow_Util.ConvertRouteStatusToActionType
12196 ( p_route_status_code => Eng_Workflow_Util.G_RT_IN_PROGRESS
12197 , p_convert_type => 'WF_PROCESS' ) ;
12198
12199 CreateRouteAction
12200 ( x_return_status => x_return_status
12201 , x_msg_count => x_msg_count
12202 , x_msg_data => x_msg_data
12203 , p_change_id => l_change_id
12204 , p_change_line_id => l_change_line_id
12205 , p_action_type => l_action_type
12206 , p_user_id => p_wf_user_id
12207 , p_parent_action_id => NULL
12208 , p_route_id => p_route_id
12209 , p_comment => NULL
12210 , x_action_id => l_action_id
12211 ) ;
12212
12213 IF g_debug_flag THEN
12214 Write_Debug('After Set Line Workflow Routing Action Log .' || x_return_status );
12215 END IF ;
12216
12217 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12218 THEN
12219 RAISE FND_API.G_EXC_ERROR ;
12220 END IF ;
12221
12222 -- Set Action Id
12223 SetActionId
12224 ( p_item_type => p_item_type
12225 , p_item_key => x_item_key
12226 , p_action_id => l_action_id
12227 ) ;
12228
12229
12230 END IF ; -- End if p_object_name = Eng_Workflow_Util.G_ENG_CHANGE_LINE
12231
12232
12233 /***********************************************
12234 -- In 115.10
12235 -- We are not supproting
12236 -- Change Line Workflow Routing
12237 -- and Header/Line Coordination
12238 --
12239 -- SetRouteParentChild
12240 -- ( x_return_status => x_return_status
12241 -- , x_msg_count => x_msg_count
12242 -- , x_msg_data => x_msg_data
12243 -- , p_change_id => l_change_id
12244 -- , p_change_line_id => l_change_line_id
12245 -- , p_route_id => p_route_id
12246 -- , p_item_type => p_item_type
12247 -- , p_item_key => x_item_key
12248 -- , p_parent_item_type => p_parent_item_type
12249 -- , p_parent_item_key => p_parent_item_key
12250 -- ) ;
12251
12252 --IF g_debug_flag THEN
12253 -- Write_Debug('After Set Parenet Child for Route Worklfow.' || x_return_status );
12254 --END IF ;
12255
12256 -- IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12257 -- THEN
12258 -- RAISE FND_API.G_EXC_ERROR ;
12259 -- END IF ;
12260 --
12261 ***********************************************/
12262
12263
12264
12265
12266 ELSIF ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_STEP_ITEM_TYPE
12267 OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE
12268 OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE
12269 )
12270 THEN
12271
12272 IF g_debug_flag THEN
12273 Write_Debug('4-2. Set Route Step Status . . .' || to_char(p_route_step_id));
12274 END IF ;
12275
12276 Eng_Workflow_Util.SetRouteStepStatus
12277 ( p_item_type => p_item_type
12278 , p_item_key => x_item_key
12279 , p_wf_user_id => p_wf_user_id
12280 , p_route_id => p_route_id
12281 , p_route_step_id => p_route_step_id
12282 , p_new_status_code => Eng_Workflow_Util.G_RT_IN_PROGRESS
12283 ) ;
12284
12285
12286 IF g_debug_flag THEN
12287 Write_Debug('4-3. Set Route Step Status . . .' || to_char(p_route_step_id));
12288 END IF ;
12289
12290 -- R12B
12291 -- Change Management Header/Line Workflow Routing Assignees Grants
12292 --
12293 -- NOTE: In R12B We support Document Revision subject and Files (Attachments)
12294 --
12295 -- Provide `view grants to workflow assignees' feature to all workflow routeing types not just for
12296 -- notification workflow type. across all subject entities
12297 -- for both header and line workflows
12298 --
12299 -- Header level: Will give Role specified in WF Definition to header subject
12300 -- entity for header workflow ad-hoc assignees across all subject entities
12301 -- Header Level: Will give OFO Role grants to header attachments for header workflow ad-hoc assignees
12302 --
12303 -- Line level: Will give Role specified in WF Definition to line subject
12304 -- entity for header workflow ad-hoc assignees across all subject entities
12305 -- Line Level: Give OFO Role grants to line workflow assignees on line attachments
12306 --
12307 -- Header and Line level: When workflow steps are re-assigned,
12308 -- same roles specified in WF Definition will be granted to the original assignee will be kept.
12309 -- In addition view grants will be provided to the new assignees
12310 --
12311 IF g_debug_flag THEN
12312 Write_Debug('calling Eng_Workflow_Util.GrantObjectRoles.' );
12313 END IF ;
12314
12315 l_index := 0 ;
12316 l_target_obj_tbl := FND_TABLE_OF_VARCHAR2_30();
12317 IF ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE )
12318 THEN
12319 l_target_obj_tbl.EXTEND ;
12320 l_index := l_index + 1 ;
12321 l_target_obj_tbl(l_index) := G_DOM_DOCUMENT_REVISION ;
12322 END IF ;
12323
12324
12325 Eng_Workflow_Util.GrantObjectRoles
12326 ( p_api_version => 1.0
12327 , p_init_msg_list => FND_API.G_FALSE --
12328 , p_commit => FND_API.G_FALSE --
12329 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
12330 , p_debug => p_debug
12331 , p_output_dir => p_output_dir
12332 , p_debug_filename => p_debug_filename
12333 , x_return_status => l_return_status
12334 , x_msg_count => l_msg_count
12335 , x_msg_data => l_msg_data
12336 , p_change_id => l_change_id
12337 , p_change_line_id => l_change_line_id
12338 , p_route_id => p_route_id
12339 , p_step_id => p_route_step_id
12340 , p_person_ids => NULL
12341 , p_target_objects => l_target_obj_tbl
12342 , p_api_caller => l_api_caller
12343 , p_grant_option => NULL
12344 ) ;
12345
12346
12347 IF g_debug_flag THEN
12348 Write_Debug('After Eng_Workflow_Util.GrantObjectRoles: ' || l_return_status );
12349 END IF ;
12350
12351 --
12352 -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
12353 -- THEN
12354 -- RAISE FND_API.G_EXC_ERROR ;
12355 -- END IF ;
12356 --
12357
12358 END IF ;
12359
12360
12361 IF g_debug_flag THEN
12362 Write_Debug('5. Executing Custom Hook: Eng_Workflow_Ext.StartCustomWorkflow . . .');
12363 Write_Debug('Item Type : ' || p_item_type );
12364 Write_Debug('Item Key : ' || x_item_key );
12365 Write_Debug('Process Name : ' || p_process_name);
12366 END IF ;
12367
12368
12369 Eng_Workflow_Ext.StartCustomWorkflow
12370 ( p_validation_level => p_validation_level
12371 , x_return_status => x_return_status
12372 , x_msg_count => x_msg_count
12373 , x_msg_data => x_msg_data
12374 , p_item_type => p_item_type
12375 , x_item_key => x_item_key
12376 , p_process_name => p_process_name
12377 , p_change_id => l_change_id
12378 , p_change_line_id => l_change_line_id
12379 , p_wf_user_id => p_wf_user_id
12380 , p_host_url => p_host_url
12381 , p_action_id => p_action_id
12382 , p_adhoc_party_list => p_adhoc_party_list
12383 , p_route_id => p_route_id
12384 , p_route_step_id => p_route_step_id
12385 , p_parent_item_type => p_parent_item_type
12386 , p_parent_item_key => p_parent_item_key
12387 , p_object_name => p_object_name
12388 , p_object_id1 => p_object_id1
12389 , p_object_id2 => p_object_id2
12390 , p_object_id3 => p_object_id3
12391 , p_object_id4 => p_object_id4
12392 , p_object_id5 => p_object_id5
12393 , p_parent_object_name => p_parent_object_name
12394 , p_parent_object_id1 => p_parent_object_id1
12395 ) ;
12396
12397 IF g_debug_flag THEN
12398 Write_Debug('Return Status: ' || x_return_status );
12399 END IF ;
12400
12401
12402 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12403 THEN
12404 RAISE FND_API.G_EXC_ERROR ;
12405 END IF ;
12406
12407 IF g_debug_flag THEN
12408 Write_Debug('6. StartProcess. . .');
12409 Write_Debug('Item Type : ' || p_item_type );
12410 Write_Debug('Item Key : ' || x_item_key );
12411 Write_Debug('Process Name : ' || p_process_name);
12412 END IF ;
12413
12414 IF p_item_type IS NOT NULL
12415 AND x_item_key IS NOT NULL
12416 THEN
12417
12418 IF g_debug_flag THEN
12419 Write_Debug('Calling WF_ENGINE.StartProcess . . .') ;
12420 END IF ;
12421
12422
12423 -- Start process
12424 WF_ENGINE.StartProcess
12425 ( itemtype => p_item_type
12426 , itemkey => x_item_key);
12427
12428 END IF ;
12429
12430 IF g_debug_flag THEN
12431 Write_Debug('After executing StartWorkflow API Body') ;
12432 END IF ;
12433
12434
12435 -- Standard check of p_commit.
12436 IF FND_API.To_Boolean( p_commit ) THEN
12437
12438 IF g_debug_flag THEN
12439 Write_Debug('Do Commit.') ;
12440 END IF ;
12441
12442 COMMIT WORK;
12443 END IF;
12444
12445 -- Standard call to get message count and if count is 1, get message info.
12446 FND_MSG_PUB.Count_And_Get
12447 ( p_count => x_msg_count
12448 , p_data => x_msg_data
12449 );
12450
12451 IF g_debug_flag THEN
12452 Write_Debug('Finish. Eng Of Proc') ;
12453 Close_Debug_Session ;
12454 END IF ;
12455
12456
12457 EXCEPTION
12458 WHEN FND_API.G_EXC_ERROR THEN
12459 -- Standard check of p_commit.
12460 IF FND_API.To_Boolean( p_commit ) THEN
12461 IF g_debug_flag THEN
12462 Write_Debug('Rollback . . .') ;
12463 END IF ;
12464 ROLLBACK TO StartWorkflow_Util ;
12465 END IF;
12466
12467 x_return_status := FND_API.G_RET_STS_ERROR ;
12468
12469 FND_MSG_PUB.Count_And_Get
12470 ( p_count => x_msg_count
12471 , p_data => x_msg_data
12472 );
12473
12474 IF g_debug_flag THEN
12475 Write_Debug('RollBack and Finish with Error.') ;
12476 Close_Debug_Session ;
12477 END IF ;
12478
12479 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12480 IF FND_API.To_Boolean( p_commit ) THEN
12481 IF g_debug_flag THEN
12482 Write_Debug('Rollback . . .') ;
12483 END IF ;
12484 ROLLBACK TO StartWorkflow_Util ;
12485 END IF;
12486
12487 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
12488
12489 FND_MSG_PUB.Count_And_Get
12490 ( p_count => x_msg_count
12491 , p_data => x_msg_data
12492 );
12493
12494 IF g_debug_flag THEN
12495 Write_Debug('Rollback and Finish with unxepcted error.') ;
12496 Close_Debug_Session ;
12497 END IF ;
12498
12499 WHEN OTHERS THEN
12500 IF FND_API.To_Boolean( p_commit ) THEN
12501 IF g_debug_flag THEN
12502 Write_Debug('Rollback . . .') ;
12503 END IF ;
12504 ROLLBACK TO StartWorkflow_Util ;
12505 END IF;
12506
12507 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
12508
12509 FND_MSG_PUB.Count_And_Get
12510 ( p_count => x_msg_count
12511 , p_data => x_msg_data
12512 );
12513
12514 IF FND_MSG_PUB.Check_Msg_Level
12515 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
12516 THEN
12517 FND_MSG_PUB.Add_Exc_Msg
12518 ( G_PKG_NAME
12519 , l_api_name
12520 );
12521 END IF;
12522
12523 FND_MSG_PUB.Count_And_Get
12524 ( p_count => x_msg_count
12525 , p_data => x_msg_data
12526 );
12527
12528 IF g_debug_flag THEN
12529 Write_Debug('Rollback and finish with system unxepcted error: '
12530 || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
12531 Close_Debug_Session ;
12532 END IF ;
12533
12534
12535 END StartWorkflow ;
12536
12537
12538
12539 PROCEDURE AbortWorkflow
12540 ( p_api_version IN NUMBER
12541 , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
12542 , p_commit IN VARCHAR2 := FND_API.G_FALSE
12543 , p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL
12544 , x_return_status OUT NOCOPY VARCHAR2
12545 , x_msg_count OUT NOCOPY NUMBER
12546 , x_msg_data OUT NOCOPY VARCHAR2
12547 , p_item_type IN VARCHAR2
12548 , p_item_key IN VARCHAR2
12549 , p_process_name IN VARCHAR2 := NULL
12550 , p_wf_user_id IN NUMBER
12551 , p_debug IN VARCHAR2 := FND_API.G_FALSE
12552 , p_output_dir IN VARCHAR2 := NULL
12553 , p_debug_filename IN VARCHAR2 := 'Eng_ChangeWF_Abort.log'
12554 )
12555 IS
12556
12557 l_api_name CONSTANT VARCHAR2(30) := 'AbortWorkflow';
12558 l_api_version CONSTANT NUMBER := 1.0;
12559
12560 l_activity_status VARCHAR2(8) ;
12561 l_change_id NUMBER ;
12562 l_change_line_id NUMBER ;
12563 l_route_id NUMBER ;
12564 l_route_step_id NUMBER ;
12565
12566 l_action_type VARCHAR2(30) ;
12567 l_action_id NUMBER ;
12568 l_parent_action_id NUMBER ;
12569
12570 l_wf_user_role VARCHAR2(320) ;
12571 l_api_caller VARCHAR2(30) ;
12572
12573
12574 l_route_object_name VARCHAR2(30) ;
12575
12576
12577
12578 -- R12B
12579 l_target_obj_tbl FND_TABLE_OF_VARCHAR2_30;
12580 l_index PLS_INTEGER ;
12581
12582 l_msg_count NUMBER ;
12583 l_msg_data VARCHAR2(2000) ;
12584 l_return_status VARCHAR2(1) ;
12585
12586
12587 BEGIN
12588 -- Standard Start of API savepoint
12589 SAVEPOINT AbortWorkflow_Util;
12590
12591 -- Standard call to check for call compatibility.
12592 IF NOT FND_API.Compatible_API_Call( l_api_version
12593 , p_api_version
12594 , l_api_name
12595 , G_PKG_NAME )
12596 THEN
12597 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12598 END IF;
12599
12600 -- Initialize message list if p_init_msg_list is set to TRUE.
12601 IF FND_API.to_Boolean( p_init_msg_list ) THEN
12602 FND_MSG_PUB.initialize;
12603 END IF ;
12604
12605
12606 -- For Test/Debug
12607 Check_And_Open_Debug_Session(p_debug, p_output_dir, p_debug_filename) ;
12608 -- R12 Comment out
12609 -- IF FND_API.to_Boolean( p_debug ) THEN
12610 -- Open_Debug_Session(p_output_dir, p_debug_filename ) ;
12611 -- END IF;
12612
12613
12614 IF g_debug_flag THEN
12615 Write_Debug('Eng_Workflow_Util.AbortWorkflow Log');
12616 Write_Debug('-----------------------------------------------------');
12617 Write_Debug('Item Type : ' || p_item_type );
12618 Write_Debug('Item Key : ' || p_item_Key );
12619 Write_Debug('Process Name : ' || p_process_name);
12620 Write_Debug('-----------------------------------------------------');
12621 Write_Debug('Initialize return status ' );
12622 END IF ;
12623
12624 -- Initialize API return status to success
12625 x_return_status := FND_API.G_RET_STS_SUCCESS;
12626
12627 -----------------------------------------------------------------
12628 -- API body
12629 -----------------------------------------------------------------
12630
12631 -- 1. ValidateAbortingProcess:
12632 -- 2. Set User Id who would abort the process:
12633 -- 3. Execute the Item Type specific logic :
12634 -- 4. Execute Custom Hook:
12635 -- 4. SetItemParent:
12636 -- 6. Release Block Abort Activity:
12637
12638 IF g_debug_flag THEN
12639 Write_Debug('1. ValidateAbortingProcess. . .');
12640 END IF ;
12641
12642 -- ValidateAbortingProcess
12643 ValidateAbortingProcess
12644 ( p_validation_level => p_validation_level
12645 , x_return_status => x_return_status
12646 , x_msg_count => x_msg_count
12647 , x_msg_data => x_msg_data
12648 , p_item_type => p_item_type
12649 , p_item_key => p_item_key
12650 , p_process_name => p_process_name
12651 , p_wf_user_id => p_wf_user_id
12652 ) ;
12653
12654
12655 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12656 THEN
12657 RAISE FND_API.G_EXC_ERROR ;
12658 END IF ;
12659
12660 IF g_debug_flag THEN
12661 Write_Debug('2. Set User Id who is aborting the process. . .');
12662 END IF ;
12663
12664 -- Set User Id
12665 IF p_wf_user_id IS NOT NULL AND p_wf_user_id >= 0
12666 THEN
12667
12668 -- Set WF User Id
12669 SetWFUserId
12670 ( p_item_type => p_item_type
12671 , p_item_key => p_item_key
12672 , p_wf_user_id => p_wf_user_id
12673 ) ;
12674
12675 l_wf_user_role := GetUserRole(p_user_id => p_wf_user_id ) ;
12676
12677
12678 -- Set WF User Role
12679 SetWFUserRole
12680 ( p_item_type => p_item_type
12681 , p_item_key => p_item_key
12682 , p_wf_user_role => l_wf_user_role
12683 ) ;
12684
12685 -- Set NTF User Role for Abort Notification
12686 SetNTFFromRole
12687 ( p_item_type => p_item_type
12688 , p_item_key => p_item_key
12689 , p_ntf_from_role => l_wf_user_role
12690 ) ;
12691
12692 ELSE
12693
12694 l_api_caller := Eng_Workflow_Util.G_WF_CALL ;
12695
12696 END IF ;
12697
12698
12699
12700 IF g_debug_flag THEN
12701 Write_Debug('3. Execute the Item Type specific logic. . .');
12702 END IF ;
12703
12704
12705 -- Put the Item Type specific logic here
12706 IF p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_ITEM_TYPE
12707 THEN
12708
12709 IF g_debug_flag THEN
12710 Write_Debug('3-1. Set Route Status . . .');
12711 END IF ;
12712
12713 -- Get Change Object Identifier
12714 Eng_Workflow_Util.GetChangeObject
12715 ( p_item_type => p_item_type
12716 , p_item_key => p_item_key
12717 , x_change_id => l_change_id
12718 ) ;
12719
12720
12721 -- Get Change Line Object Identifier
12722 Eng_Workflow_Util.GetChangeLineObject
12723 ( p_item_type => p_item_type
12724 , p_item_key => p_item_key
12725 , x_change_line_id => l_change_line_id
12726 ) ;
12727
12728 -- Get Route Id
12729 Eng_Workflow_Util.GetRouteId
12730 ( p_item_type => p_item_type
12731 , p_item_key => p_item_key
12732 , x_route_id => l_route_id
12733 ) ;
12734
12735 -- Get Route Object Name
12736 Eng_Workflow_Util.GetRouteObject
12737 ( p_item_type => p_item_type
12738 , p_item_key => p_item_key
12739 , x_route_object => l_route_object_name
12740 ) ;
12741
12742
12743
12744 SetRouteStatus
12745 ( p_item_type => p_item_type
12746 , p_item_key => p_item_key
12747 , p_wf_user_id => p_wf_user_id
12748 , p_route_id => l_route_id
12749 , p_new_status_code => Eng_Workflow_Util.G_RT_ABORTED
12750 , p_change_id => l_change_id
12751 , p_change_line_id => l_change_line_id -- Added in R12B
12752 ) ;
12753
12754
12755 /* Workflow will not change approval status in 115.10
12756 IF g_debug_flag THEN
12757 Write_Debug('3-2. Set Approval Route Status . . .');
12758 END IF ;
12759
12760 -- SetChangeApprovalStatus
12761 -- ( x_return_status => x_return_status
12762 -- , x_msg_count => x_msg_count
12763 -- , x_msg_data => x_msg_data
12764 -- , p_item_type => p_item_type
12765 -- , p_item_key => p_item_key
12766 -- , p_change_id => l_change_id
12767 -- , p_change_line_id => l_change_line_id
12768 -- , p_wf_user_id => p_wf_user_id
12769 -- , p_new_appr_status_type => Eng_Workflow_Util.G_NOT_SUBMITTED
12770 -- ) ;
12771
12772 IF g_debug_flag THEN
12773 Write_Debug('After Set Approval Status .' || x_return_status );
12774 END IF ;
12775
12776 -- IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12777 -- THEN
12778 -- RAISE FND_API.G_EXC_ERROR ;
12779 -- END IF ;
12780
12781 */
12782
12783 IF g_debug_flag THEN
12784 Write_Debug('3-3. Abort Child Route Step Workflows . . .');
12785 END IF ;
12786
12787 AbortRouteSteps
12788 ( x_return_status => x_return_status
12789 , x_msg_count => x_msg_count
12790 , x_msg_data => x_msg_data
12791 , p_route_item_type => p_item_type
12792 , p_route_item_key => p_item_key
12793 , p_wf_user_id => p_wf_user_id
12794 ) ;
12795
12796 IF g_debug_flag THEN
12797 Write_Debug('After Route Step Workflow ' || x_return_status );
12798 END IF ;
12799
12800 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12801 THEN
12802 RAISE FND_API.G_EXC_ERROR ;
12803 END IF ;
12804
12805
12806 -- In case that Route Object is Change Object
12807 IF l_route_object_name = Eng_Workflow_Util.G_ENG_CHANGE
12808 THEN
12809
12810 --
12811 -- R12 DOM LC Phase Workflow Support
12812 --
12813 IF ( ENG_DOCUMENT_UTIL.Is_Dom_Document_Lifecycle( p_change_id => l_change_id) )
12814 THEN
12815
12816 IF g_debug_flag THEN
12817 Write_Debug('Change Object is a Doc LC Object, calling API. . . . ');
12818 Write_Debug('Calling ENG_DOCUMENT_UTIL.Abort_Doc_LC_Phase_WF. . .' );
12819 END IF ;
12820
12821 ENG_DOCUMENT_UTIL.Abort_Doc_LC_Phase_WF
12822 ( p_api_version => 1.0
12823 , p_init_msg_list => FND_API.G_FALSE --
12824 , p_commit => FND_API.G_FALSE --
12825 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
12826 , x_return_status => l_return_status
12827 , x_msg_count => l_msg_count
12828 , x_msg_data => l_msg_data
12829 , p_change_id => l_change_id -- Change Id
12830 , p_route_id => l_route_id -- WF Route ID
12831 ) ;
12832
12833
12834 IF g_debug_flag THEN
12835 Write_Debug('After calling ENG_DOCUMENT_UTIL.Abort_Doc_LC_Phase_WF: ' || l_return_status );
12836 END IF ;
12837 IF l_return_status <> FND_API.G_RET_STS_SUCCESS
12838 THEN
12839 RAISE FND_API.G_EXC_ERROR ;
12840 END IF ;
12841
12842 END IF ;
12843
12844
12845 IF g_debug_flag THEN
12846 Write_Debug('3-4. Set Workflow Routing Action Log . . .');
12847 END IF ;
12848
12849 -- Get Action Id and set this as parent action id
12850 Eng_Workflow_Util.GetActionId
12851 ( p_item_type => p_item_type
12852 , p_item_key => p_item_key
12853 , x_action_id => l_parent_action_id
12854 ) ;
12855
12856 l_action_type := Eng_Workflow_Util.ConvertRouteStatusToActionType
12857 ( p_route_status_code => Eng_Workflow_Util.G_RT_ABORTED
12858 , p_convert_type => 'WF_PROCESS' ) ;
12859
12860
12861 CreateRouteAction
12862 ( x_return_status => x_return_status
12863 , x_msg_count => x_msg_count
12864 , x_msg_data => x_msg_data
12865 , p_change_id => l_change_id
12866 , p_change_line_id => l_change_line_id
12867 , p_action_type => l_action_type
12868 , p_user_id => p_wf_user_id
12869 , p_parent_action_id => l_parent_action_id
12870 , p_route_id => l_route_id
12871 , p_comment => NULL
12872 , x_action_id => l_action_id
12873 ) ;
12874
12875 IF g_debug_flag THEN
12876 Write_Debug('After Set Workflow Routing Action Log: ' || x_return_status );
12877 END IF ;
12878
12879 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12880 THEN
12881 RAISE FND_API.G_EXC_ERROR ;
12882 END IF ;
12883
12884
12885 -- R12B
12886 -- No need to call Eng_Workflow_Util.SyncChangeLCPhase
12887 -- For Line
12888 IF ( l_change_line_id IS NULL OR l_change_line_id <= 0)
12889 THEN
12890
12891 -- Call Sync Change Lifecycle Phase API
12892 Eng_Workflow_Util.SyncChangeLCPhase
12893 ( x_return_status => x_return_status
12894 , x_msg_count => x_msg_count
12895 , x_msg_data => x_msg_data
12896 , p_route_id => l_route_id
12897 , p_api_caller => l_api_caller
12898 ) ;
12899
12900
12901 IF g_debug_flag THEN
12902 Write_Debug('After call SyncChangeLCPhase: ' || x_return_status );
12903 END IF ;
12904
12905 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12906 THEN
12907 RAISE FND_API.G_EXC_ERROR ;
12908 END IF ;
12909 END IF ;
12910
12911
12912 -- R12B Line Workfow Routing
12913 -- In case that Route Object is Change Line Object
12914 ELSIF l_route_object_name = Eng_Workflow_Util.G_ENG_CHANGE_LINE
12915 THEN
12916
12917
12918 IF g_debug_flag THEN
12919 Write_Debug('4-4. Set Line Workflow Routing Action Log . . .');
12920 END IF ;
12921
12922 -- Get Action Id and set this as parent action id
12923 Eng_Workflow_Util.GetActionId
12924 ( p_item_type => p_item_type
12925 , p_item_key => p_item_key
12926 , x_action_id => l_parent_action_id
12927 ) ;
12928
12929
12930 l_action_type := Eng_Workflow_Util.ConvertRouteStatusToActionType
12931 ( p_route_status_code => Eng_Workflow_Util.G_RT_ABORTED
12932 , p_convert_type => 'WF_PROCESS' ) ;
12933
12934
12935 CreateRouteAction
12936 ( x_return_status => x_return_status
12937 , x_msg_count => x_msg_count
12938 , x_msg_data => x_msg_data
12939 , p_change_id => l_change_id
12940 , p_change_line_id => l_change_line_id
12941 , p_action_type => l_action_type
12942 , p_user_id => p_wf_user_id
12943 , p_parent_action_id => l_parent_action_id
12944 , p_route_id => l_route_id
12945 , p_comment => NULL
12946 , x_action_id => l_action_id
12947 ) ;
12948
12949 IF g_debug_flag THEN
12950 Write_Debug('After Set Line Workflow Routing Abort Action Log .' || x_return_status );
12951 END IF ;
12952
12953 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12954 THEN
12955 RAISE FND_API.G_EXC_ERROR ;
12956 END IF ;
12957
12958
12959 END IF ; -- End if p_object_name = Eng_Workflow_Util.G_ENG_CHANGE_LINE
12960
12961
12962
12963
12964
12965 -- R12B Revoke Roles
12966 l_index := 0 ;
12967
12968 IF ( ENG_DOCUMENT_UTIL.Is_Dom_Document_Lifecycle( p_change_id => l_change_id) )
12969 THEN
12970
12971 IF g_debug_flag THEN
12972 Write_Debug('Change Object is a Doc LC Object, Setting target objects. . . . ');
12973 END IF ;
12974 l_target_obj_tbl := FND_TABLE_OF_VARCHAR2_30();
12975 l_target_obj_tbl.EXTEND ;
12976 l_index := l_index+1 ;
12977 l_target_obj_tbl(l_index) := G_DOM_DOCUMENT_REVISION ;
12978 END IF ;
12979
12980
12981 IF g_debug_flag THEN
12982 Write_Debug('Calling Eng_Workflow_Util.RevokeObjectRoles . . . . ');
12983 END IF ;
12984
12985
12986 Eng_Workflow_Util.RevokeObjectRoles
12987 ( p_api_version => 1.0
12988 , p_init_msg_list => FND_API.G_FALSE --
12989 , p_commit => FND_API.G_FALSE --
12990 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
12991 , p_debug => p_debug
12992 , p_output_dir => p_output_dir
12993 , p_debug_filename => p_debug_filename
12994 , x_return_status => l_return_status
12995 , x_msg_count => l_msg_count
12996 , x_msg_data => l_msg_data
12997 , p_change_id => l_change_id
12998 , p_change_line_id => l_change_line_id
12999 , p_route_id => l_route_id
13000 , p_person_ids => NULL
13001 , p_target_objects => l_target_obj_tbl
13002 , p_api_caller => l_api_caller
13003 , p_revoke_option => NULL
13004 ) ;
13005
13006
13007 IF g_debug_flag THEN
13008 Write_Debug('After Eng_Workflow_Util.RevokeObjectRoles.' || l_return_status );
13009 END IF ;
13010
13011 --
13012 -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
13013 -- THEN
13014 -- RAISE FND_API.G_EXC_ERROR ;
13015 -- END IF ;
13016 --
13017
13018 -- R12B
13019 ELSIF ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_STEP_ITEM_TYPE
13020 OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE
13021 OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE
13022 )
13023 THEN
13024
13025 -- Get Route Step Id
13026 GetRouteStepId
13027 ( p_item_type => p_item_type
13028 , p_item_key => p_item_key
13029 , x_route_step_id => l_route_step_id
13030 ) ;
13031
13032 IF g_debug_flag THEN
13033 Write_Debug('3-1. Set Route Step Status . . .' || to_char(l_route_step_id));
13034 END IF ;
13035
13036 SetRouteStepStatus
13037 ( p_item_type => p_item_type
13038 , p_item_key => p_item_key
13039 , p_wf_user_id => p_wf_user_id
13040 , p_route_id => l_route_id
13041 , p_route_step_id => l_route_step_id
13042 , p_new_status_code => Eng_Workflow_Util.G_RT_ABORTED
13043 ) ;
13044
13045
13046 END IF ;
13047
13048
13049 IF g_debug_flag THEN
13050 Write_Debug('4. Executing Custom Hook: Eng_Workflow_Ext.AbortCustomWorkflow . . .');
13051 Write_Debug('Item Type : ' || p_item_type );
13052 Write_Debug('Item Key : ' || p_item_key );
13053 Write_Debug('Process Name : ' || p_process_name);
13054 END IF ;
13055
13056
13057 Eng_Workflow_Ext.AbortCustomWorkflow
13058 ( p_validation_level => p_validation_level
13059 , x_return_status => x_return_status
13060 , x_msg_count => x_msg_count
13061 , x_msg_data => x_msg_data
13062 , p_item_type => p_item_type
13063 , p_item_key => p_item_key
13064 , p_process_name => p_process_name
13065 , p_wf_user_id => p_wf_user_id
13066 ) ;
13067
13068
13069 IF g_debug_flag THEN
13070 Write_Debug('Return Status: ' || x_return_status );
13071 END IF ;
13072
13073
13074 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
13075 THEN
13076 RAISE FND_API.G_EXC_ERROR ;
13077 END IF ;
13078
13079
13080
13081 -- 6. Abort Process or Release 'Block Abort' Activty
13082 -- Fisrt, check if Block Abort Activity is 'NOTIFIED'
13083 -- if so, complete Block Abort Activity
13084 -- if not, abort the process
13085
13086 IF g_debug_flag THEN
13087 Write_Debug('6. Abort Process or Release Block Abort Activty . . ' );
13088 END IF ;
13089
13090
13091 CheckWFActivityStatus
13092 ( p_item_type => p_item_type
13093 , p_item_key => p_item_key
13094 , p_activity_name => Eng_Workflow_Util.G_BLOCK_ABORT_ACTIVITY
13095 , x_activity_status => l_activity_status
13096 );
13097
13098 IF g_debug_flag THEN
13099 Write_Debug('6-1. Abort Block Activity Status: ' || l_activity_status );
13100 END IF ;
13101
13102
13103
13104 IF (l_activity_status = Eng_Workflow_Util.G_WF_NOTIFIED)
13105 THEN
13106
13107 IF g_debug_flag THEN
13108 Write_Debug('6-2. Complete Abort Block Activity. . .' );
13109 END IF ;
13110
13111
13112 WF_ENGINE.CompleteActivity( p_item_type
13113 , p_item_key
13114 , Eng_Workflow_Util.G_BLOCK_ABORT_ACTIVITY
13115 , Eng_Workflow_Util.G_WF_COMPLETE
13116 );
13117
13118 ELSE
13119
13120 IF g_debug_flag THEN
13121 Write_Debug('6-2. Abort Workflow Process directly. . .' );
13122 END IF ;
13123
13124
13125
13126 WF_ENGINE.AbortProcess( p_item_type
13127 , p_Item_key
13128 , p_process_name
13129 );
13130
13131 END IF;
13132
13133
13134 IF g_debug_flag THEN
13135 Write_Debug('After executing AbortWorkflow API Body') ;
13136 END IF ;
13137
13138
13139 -- Standard check of p_commit.
13140 IF FND_API.To_Boolean( p_commit ) THEN
13141
13142 IF g_debug_flag THEN
13143 Write_Debug('Do Commit.') ;
13144 END IF ;
13145
13146 COMMIT WORK;
13147
13148 END IF;
13149
13150 -- Standard call to get message count and if count is 1, get message info.
13151 FND_MSG_PUB.Count_And_Get
13152 ( p_count => x_msg_count
13153 , p_data => x_msg_data
13154 );
13155
13156 IF g_debug_flag THEN
13157 Write_Debug('Finish. Eng Of Proc') ;
13158 Close_Debug_Session ;
13159 END IF ;
13160
13161 -- To remove the step assignee created by the Reassignment.
13162
13163 EXCEPTION
13164 WHEN FND_API.G_EXC_ERROR THEN
13165 IF FND_API.To_Boolean( p_commit ) THEN
13166 IF g_debug_flag THEN
13167 Write_Debug('Rollback . . .') ;
13168 END IF ;
13169 ROLLBACK TO AbortWorkflow_Util ;
13170 END IF;
13171
13172 x_return_status := FND_API.G_RET_STS_ERROR ;
13173
13174 FND_MSG_PUB.Count_And_Get
13175 ( p_count => x_msg_count
13176 , p_data => x_msg_data
13177 );
13178
13179 IF g_debug_flag THEN
13180 Write_Debug('Finish with Error.') ;
13181 Close_Debug_Session ;
13182 END IF ;
13183
13184 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
13185 IF FND_API.To_Boolean( p_commit ) THEN
13186 IF g_debug_flag THEN
13187 Write_Debug('Rollback . . .') ;
13188 END IF ;
13189 ROLLBACK TO AbortWorkflow_Util ;
13190 END IF;
13191
13192 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
13193
13194 FND_MSG_PUB.Count_And_Get
13195 ( p_count => x_msg_count
13196 , p_data => x_msg_data
13197 );
13198
13199 IF g_debug_flag THEN
13200 Write_Debug('Finish with unxepcted error.') ;
13201 Close_Debug_Session ;
13202 END IF ;
13203
13204 WHEN OTHERS THEN
13205 IF FND_API.To_Boolean( p_commit ) THEN
13206 IF g_debug_flag THEN
13207 Write_Debug('Rollback . . .') ;
13208 END IF ;
13209 ROLLBACK TO AbortWorkflow_Util ;
13210 END IF;
13211
13212 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
13213
13214 FND_MSG_PUB.Count_And_Get
13215 ( p_count => x_msg_count
13216 , p_data => x_msg_data
13217 );
13218
13219 IF FND_MSG_PUB.Check_Msg_Level
13220 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
13221 THEN
13222 FND_MSG_PUB.Add_Exc_Msg
13223 ( G_PKG_NAME
13224 , l_api_name
13225 );
13226 END IF;
13227
13228 FND_MSG_PUB.Count_And_Get
13229 ( p_count => x_msg_count
13230 , p_data => x_msg_data
13231 );
13232
13233 IF g_debug_flag THEN
13234 Write_Debug('Finish with system unxepcted error: '
13235 || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
13236 Close_Debug_Session ;
13237 END IF ;
13238
13239
13240 END AbortWorkflow ;
13241
13242 PROCEDURE reassignRoutePeople( x_return_status OUT NOCOPY VARCHAR2
13243 , x_msg_count OUT NOCOPY NUMBER
13244 , x_msg_data OUT NOCOPY VARCHAR2
13245 , p_item_type IN VARCHAR2
13246 , p_item_key IN VARCHAR2
13247 , p_notification_id IN NUMBER
13248 , p_reassign_mode IN VARCHAR2)
13249
13250 IS
13251
13252 l_notification_id NUMBER;
13253
13254 l_change_id NUMBER ;
13255 l_object_name VARCHAR2(30);
13256 l_step_id NUMBER;
13257
13258 l_route_people_id NUMBER;
13259 l_assignee_type_code VARCHAR2(30);
13260 l_original_assignee_id NUMBER ;
13261 l_original_assignee_type_code VARCHAR2(30);
13262 l_response_condition_code VARCHAR2(30);
13263 l_adhoc_people_flag VARCHAR2(1) ;
13264 l_response_code VARCHAR2(30);
13265 l_comment VARCHAR2(4000);
13266
13267 --l_party_id NUMBER;
13268 --l_fnd_user_id NUMBER ;
13269 --l_fnd_login_id NUMBER ;
13270
13271 l_performer_user_id NUMBER;
13272 l_performer_party_id NUMBER;
13273
13274
13275 l_rowid ROWID;
13276 l_new_party_id NUMBER :=-1;
13277 l_new_route_people_id NUMBER ;
13278 l_new_route_assoc_id NUMBER;
13279
13280 l_created_action_id NUMBER;
13281 l_action_type VARCHAR2(30);
13282
13283 l_return_status VARCHAR2(1);
13284 l_msg_count NUMBER;
13285 l_msg_data VARCHAR2(3000);
13286
13287 -- R12B
13288 l_route_id NUMBER;
13289 l_change_line_id NUMBER;
13290 l_target_obj_tbl FND_TABLE_OF_VARCHAR2_30;
13291 l_obj_index PLS_INTEGER ;
13292 l_person_id_tbl FND_TABLE_OF_NUMBER ;
13293 l_person_idx PLS_INTEGER ;
13294 l_default_assignee_resp VARCHAR2(30) ;
13295
13296 --Bug 11802032 Start
13297 l_chg_rte_cnt_nonull_ntfid NUMBER := 0;
13298 --Bug 11802032 END
13299
13300 CURSOR c_route_person ( p_step_id NUMBER
13301 , p_notification_id NUMBER )
13302 IS
13303 SELECT EngSecPeople.user_id
13304 , EngSecPeople.person_id
13305 , RoutePeople.route_people_id
13306 , RoutePeople.adhoc_people_flag
13307 , RoutePeople.assignee_type_code
13308 , RoutePeople.original_assignee_id
13309 , RoutePeople.original_assignee_type_code
13310 , RoutePeople.response_condition_code
13311 FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
13312 , ENG_SECURITY_PEOPLE_V EngSecPeople
13313 , WF_NOTIFICATIONS wn
13314 WHERE RoutePeople.assignee_id = EngSecPeople.person_id
13315 -- AND RoutePeople.assignee_type_code = p_assignee_type_code
13316 AND RoutePeople.step_id = p_step_id
13317 AND ( RoutePeople.response_code IS NULL
13318 OR RoutePeople.response_code = Eng_Workflow_Util.G_RT_SUBMITTED
13319 OR RoutePeople.response_code = Eng_Workflow_Util.G_RT_NOT_RECEIVED )
13320 AND EngSecPeople.user_name = wn.recipient_role
13321 AND wn.notification_id = p_notification_id ;
13322
13323 --Bug 11802032 Start
13324 -- Note: If p_chg_rte_cnt_nonull_ntfid >0, c_route_person_ntf includes only nonull wf_notification_id rows.
13325 -- If p_chg_rte_cnt_nonull_ntfid =0, c_route_person_ntf includes only null wf_notification_id rows.
13326 CURSOR c_route_person_ntf ( p_step_id NUMBER
13327 , p_notification_id NUMBER
13328 , p_chg_rte_cnt_nonull_ntfid NUMBER)
13329 IS
13330 SELECT /*+ push_pred(engsecpeople) */ EngSecPeople.user_id --16324566
13331 , EngSecPeople.person_id
13332 , RoutePeople.route_people_id
13333 , RoutePeople.adhoc_people_flag
13334 , RoutePeople.assignee_type_code
13335 , RoutePeople.original_assignee_id
13336 , RoutePeople.original_assignee_type_code
13337 , RoutePeople.response_condition_code
13338 FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
13339 , ENG_SECURITY_PEOPLE_V EngSecPeople
13340 , WF_NOTIFICATIONS wn
13341 WHERE RoutePeople.assignee_id = EngSecPeople.person_id
13342 -- AND RoutePeople.assignee_type_code = p_assignee_type_code
13343 AND RoutePeople.step_id = p_step_id
13344 AND ( RoutePeople.response_code IS NULL
13345 OR RoutePeople.response_code = Eng_Workflow_Util.G_RT_SUBMITTED
13346 OR RoutePeople.response_code = Eng_Workflow_Util.G_RT_NOT_RECEIVED )
13347 AND EngSecPeople.user_name = wn.recipient_role
13348 AND wn.notification_id = p_notification_id
13349 AND ( ( p_chg_rte_cnt_nonull_ntfid > 0 and RoutePeople.wf_notification_id = p_notification_id )
13350 OR ( p_chg_rte_cnt_nonull_ntfid = 0 and RoutePeople.wf_notification_id is null)) ;
13351 --Bug 11802032 End
13352
13353 CURSOR c_report_people_assocs (p_route_people_id NUMBER)
13354 IS
13355 SELECT ASSOC_OBJECT_NAME,ASSOC_OBJ_PK1_VALUE, ADHOC_ASSOC_FLAG,
13356 OBJECT_NAME, OBJECT_ID1 from ENG_CHANGE_ROUTE_ASSOCS
13357 where ROUTE_PEOPLE_ID=p_route_people_id;
13358
13359 BEGIN
13360 -- Initialize API return status to success
13361 x_return_status := FND_API.G_RET_STS_SUCCESS;
13362
13363 IF g_debug_flag THEN
13364 Write_Debug('Route p_notification_id ' || to_char(p_notification_id));
13365 END IF ;
13366
13367 -- Get Change Object Identifier
13368 GetChangeObject
13369 ( p_item_type => p_item_type
13370 , p_item_key => p_item_key
13371 , x_change_id => l_change_id
13372 ) ;
13373
13374
13375 -- Get Object Type
13376 l_object_name := GetChangeObjectName
13377 ( p_change_id => l_change_id ) ;
13378
13379
13380 -- Get Current Route Step Id
13381 GetRouteStepId
13382 ( p_item_type => p_item_type
13383 , p_item_key => p_item_key
13384 , x_route_step_id => l_step_id
13385 ) ;
13386
13387
13388 -- R12B
13389 -- Get Route Id
13390 GetRouteId
13391 ( p_item_type => p_item_type
13392 , p_item_key => p_item_key
13393 , x_route_id => l_route_id
13394 ) ;
13395
13396 -- Get Change Object Identifier
13397 GetChangeLineObject
13398 ( p_item_type => p_item_type
13399 , p_item_key => p_item_key
13400 , x_change_line_id => l_change_line_id
13401 ) ;
13402
13403
13404 l_notification_id :=p_notification_id;
13405 l_comment := WF_ENGINE.context_user_comment;
13406
13407
13408 IF g_debug_flag THEN
13409 Write_Debug('Route Step id ' || to_char(l_step_id));
13410 Write_Debug('Route p_item_type ' || p_item_type);
13411 Write_Debug('Route p_item_key ' || p_item_key);
13412 Write_Debug('Route new role ' || WF_ENGINE.context_new_role);
13413 Write_Debug('Change Id ' || to_char(l_change_id));
13414 END IF ;
13415
13416 -- 14060173, wrap it in exception handler, and show msg,
13417 -- Cannot transfer notification to invalid role '&ROLE'
13418 begin
13419 SELECT person_id into l_new_party_id
13420 FROM ENG_SECURITY_PEOPLE_V
13421 WHERE user_name = WF_ENGINE.context_new_role;
13422 exception
13423 when no_data_found then
13424 IF g_debug_flag THEN
13425 Write_Debug('Transfer only supports users, new rols is invalid ');
13426 END IF ;
13427
13428 x_return_status := FND_API.G_RET_STS_ERROR ;
13429 Wf_Core.context('Eng_Workflow_Util', 'reassignRoutePeople',
13430 p_item_type, p_item_key, p_notification_id, p_reassign_mode);
13431 Wf_Core.Token('ROLE', WF_ENGINE.context_new_role);
13432 Wf_Core.Raise('WFNTF_TRANSFER_FAIL');
13433 end;
13434 -- end 14060173
13435
13436 IF g_debug_flag THEN
13437 Write_Debug('Route NEW Party id to whom NTF is being transfered or reassigned: ' || to_char(l_new_party_id));
13438 END IF ;
13439
13440 IF (p_reassign_mode = G_WF_TRANSFER)
13441 THEN
13442 l_response_code := G_RT_TRANSFERRED ;
13443
13444 ELSIF (p_reassign_mode=G_WF_FORWARD)
13445 THEN
13446 l_response_code := G_RT_FORWARDED ;
13447 END IF;
13448
13449 --Bug 11802032 Start
13450 --Note: Check whether ENG_CHANGE_ROUTE_PEOPLE has wf_notification_id or not.
13451 -- bug 16324566, not use count(), add hint
13452 begin
13453 SELECT /*+ push_pred(ENGSECPEOPLE) */ 1
13454 into l_chg_rte_cnt_nonull_ntfid
13455 FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
13456 , ENG_SECURITY_PEOPLE_V EngSecPeople
13457 , WF_NOTIFICATIONS wn
13458 WHERE RoutePeople.assignee_id = EngSecPeople.person_id
13459 AND RoutePeople.step_id = l_step_id
13460 AND EngSecPeople.user_name = wn.recipient_role
13461 AND wn.notification_id = p_notification_id
13462 AND RoutePeople.wf_notification_id = p_notification_id
13463 AND rownum = 1;
13464 exception
13465 when no_data_found then
13466 l_chg_rte_cnt_nonull_ntfid := 0;
13467 END;
13468
13469 --Bug 11802032 End
13470
13471 FOR rtp_rec IN c_route_person_ntf ( p_step_id => l_step_id
13472 , p_notification_id => p_notification_id
13473 , p_chg_rte_cnt_nonull_ntfid => l_chg_rte_cnt_nonull_ntfid) --Bug 11802032
13474 LOOP
13475 l_performer_user_id := rtp_rec.user_id ;
13476 l_performer_party_id := rtp_rec.person_id ;
13477 l_route_people_id := rtp_rec.route_people_id ;
13478 l_adhoc_people_flag := rtp_rec.adhoc_people_flag ;
13479 l_assignee_type_code := rtp_rec.assignee_type_code ;
13480 l_original_assignee_id := rtp_rec.original_assignee_id ;
13481 l_original_assignee_type_code := rtp_rec.original_assignee_type_code ;
13482 l_response_condition_code := rtp_rec.response_condition_code ;
13483
13484
13485 update ENG_CHANGE_ROUTE_PEOPLE set
13486 WF_NOTIFICATION_ID = p_notification_id,
13487 RESPONSE_CODE = l_response_code ,
13488 RESPONSE_DATE = SYSDATE ,
13489 LAST_UPDATE_DATE = SYSDATE ,
13490 LAST_UPDATED_BY = l_performer_user_id ,
13491 LAST_UPDATE_LOGIN = null
13492 where ROUTE_PEOPLE_ID = l_route_people_id ;
13493
13494 update ENG_CHANGE_ROUTE_PEOPLE_TL set
13495 RESPONSE_DESCRIPTION = l_comment,
13496 LAST_UPDATE_DATE = SYSDATE ,
13497 LAST_UPDATED_BY = l_performer_user_id ,
13498 LAST_UPDATE_LOGIN = null ,
13499 SOURCE_LANG = userenv('LANG')
13500 where ROUTE_PEOPLE_ID = l_route_people_id ;
13501
13502
13503
13504
13505 l_default_assignee_resp := Eng_Workflow_Util.G_RT_SUBMITTED ;
13506
13507 IF ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE
13508 AND Eng_Workflow_Util.Is_Line_Ntf_WF(p_route_id => l_route_id)
13509 )
13510 THEN
13511
13512 IF g_debug_flag THEN
13513 Write_Debug('Calling GetStepDefaultRespCode ' ) ;
13514 END IF ;
13515
13516 Eng_Workflow_Util.GetStepDefaultRespCode
13517 ( p_step_id => l_step_id
13518 , x_default_resp_code => l_default_assignee_resp
13519 ) ;
13520
13521 IF g_debug_flag THEN
13522 Write_Debug('Get Route Assignee Response : ' || l_default_assignee_resp ) ;
13523 END IF ;
13524
13525 END IF ;
13526
13527 select ENG_CHANGE_ROUTE_PEOPLE_S.nextval into l_new_route_people_id from dual;
13528
13529 Eng_Change_Route_People_Util.INSERT_ROW
13530 (
13531 X_ROWID => l_rowid,
13532 X_ROUTE_PEOPLE_ID => l_new_route_people_id ,
13533 X_STEP_ID => l_step_id ,
13534 X_ASSIGNEE_ID => l_new_party_id,
13535 X_ASSIGNEE_TYPE_CODE => G_PERSON,
13536 X_ADHOC_PEOPLE_FLAG => 'Y',
13537 X_WF_NOTIFICATION_ID => l_notification_id ,
13538 X_RESPONSE_CODE => l_default_assignee_resp ,
13539 X_RESPONSE_DATE => TO_DATE(NULL),
13540 X_REQUEST_ID => NULL,
13541 X_ORIGINAL_SYSTEM_REFERENCE => NULL,
13542 X_RESPONSE_DESCRIPTION => NULL,
13543 X_CREATION_DATE => SYSDATE,
13544 X_CREATED_BY => l_performer_user_id,
13545 X_LAST_UPDATE_DATE => SYSDATE,
13546 X_LAST_UPDATED_BY => l_performer_user_id,
13547 X_LAST_UPDATE_LOGIN => null,
13548 X_PROGRAM_ID => null,
13549 X_PROGRAM_APPLICATION_ID => null,
13550 X_PROGRAM_UPDATE_DATE => null,
13551 X_ORIGINAL_ASSIGNEE_ID => l_original_assignee_id,
13552 X_ORIGINAL_ASSIGNEE_TYPE_CODE => l_original_assignee_type_code,
13553 X_RESPONSE_CONDITION_CODE => l_response_condition_code,
13554 X_PARENT_ROUTE_PEOPLE_ID => l_route_people_id
13555 ) ;
13556
13557 FOR assoc_rec in c_report_people_assocs(l_route_people_id)
13558 LOOP
13559 SELECT ENG_CHANGE_ROUTE_ASSOCS_S.nextval into l_new_route_assoc_id from DUAL;
13560
13561 insert into ENG_CHANGE_ROUTE_ASSOCS
13562 (
13563 ROUTE_ASSOCIATION_ID ,
13564 ROUTE_PEOPLE_ID,
13565 ASSOC_OBJECT_NAME,
13566 ASSOC_OBJ_PK1_VALUE,
13567 ADHOC_ASSOC_FLAG,
13568 OBJECT_NAME,
13569 OBJECT_ID1,
13570 CREATION_DATE ,
13571 CREATED_BY ,
13572 LAST_UPDATE_DATE ,
13573 LAST_UPDATED_BY ,
13574 LAST_UPDATE_LOGIN
13575 )
13576 values
13577 (
13578 l_new_route_assoc_id,
13579 l_new_route_people_id,
13580 assoc_rec.ASSOC_OBJECT_NAME,
13581 assoc_rec.ASSOC_OBJ_PK1_VALUE,
13582 'Y',
13583 assoc_rec.OBJECT_NAME,
13584 assoc_rec.OBJECT_ID1,
13585 SYSDATE,
13586 l_performer_user_id,
13587 SYSDATE,
13588 l_performer_user_id,
13589 l_performer_user_id
13590 );
13591
13592 END LOOP;
13593 END LOOP;
13594
13595
13596 -- R12B
13597 -- CreateAction API will take care of inserting the action
13598 -- properly for Line Workflow too.
13599 IF l_change_id IS NOT NULL AND l_change_id > 0
13600 THEN
13601 l_action_type := Eng_Workflow_Util.ConvertRouteStatusToActionType
13602 ( p_route_status_code => l_response_code
13603 , p_convert_type => 'RESPONSE' ) ;
13604
13605 -- Record Action
13606 Eng_Workflow_Util.CreateAction
13607 ( x_return_status => l_return_status
13608 , x_msg_count => l_msg_count
13609 , x_msg_data => l_msg_data
13610 , p_item_type => p_item_type
13611 , p_item_key => p_item_key
13612 , p_notification_id => p_notification_id
13613 , p_action_type => l_action_type
13614 , p_comment => l_comment
13615 , x_action_id => l_created_action_id
13616 , p_assignee_id => l_new_party_id
13617 ) ;
13618
13619
13620 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
13621
13622 x_return_status := l_return_status ;
13623 x_msg_count := l_msg_count ;
13624 x_msg_data := l_msg_data ;
13625 END IF ;
13626
13627 END IF ; -- changeId is not null
13628
13629
13630 --
13631 -- R12B
13632 -- Grant Object Roles for this new assignee
13633 IF ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_STEP_ITEM_TYPE
13634 OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE
13635 OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE
13636 )
13637 THEN
13638
13639
13640 l_obj_index := 0 ;
13641 l_person_idx := 0 ;
13642
13643 IF ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE )
13644 THEN
13645 l_target_obj_tbl := FND_TABLE_OF_VARCHAR2_30();
13646 l_target_obj_tbl.EXTEND ;
13647 l_obj_index := l_obj_index + 1 ;
13648 l_target_obj_tbl(l_obj_index) := G_DOM_DOCUMENT_REVISION ;
13649 END IF ;
13650
13651
13652 l_person_id_tbl := FND_TABLE_OF_NUMBER();
13653 l_person_id_tbl.EXTEND ;
13654 l_person_idx := l_person_idx + 1 ;
13655 l_person_id_tbl(l_person_idx) := l_new_party_id ;
13656
13657
13658 IF g_debug_flag THEN
13659 Write_Debug('Calling Eng_Workflow_Util.GrantObjectRoles for transfer assignee: ' || l_new_party_id );
13660 END IF ;
13661
13662 Eng_Workflow_Util.GrantObjectRoles
13663 ( p_api_version => 1.0
13664 , p_init_msg_list => FND_API.G_FALSE --
13665 , p_commit => FND_API.G_FALSE --
13666 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
13667 , p_debug => FND_API.G_FALSE
13668 , p_output_dir => NULL
13669 , p_debug_filename => NULL
13670 , x_return_status => l_return_status
13671 , x_msg_count => l_msg_count
13672 , x_msg_data => l_msg_data
13673 , p_change_id => l_change_id
13674 , p_change_line_id => l_change_line_id
13675 , p_route_id => l_route_id
13676 , p_step_id => l_step_id
13677 , p_person_ids => l_person_id_tbl
13678 , p_target_objects => l_target_obj_tbl
13679 , p_api_caller => G_WF_CALL
13680 , p_grant_option => NULL
13681 ) ;
13682
13683 IF g_debug_flag THEN
13684 Write_Debug('After Eng_Workflow_Util.GrantObjectRoles: ' || l_return_status );
13685 END IF ;
13686
13687 --
13688 -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
13689 -- THEN
13690 -- RAISE FND_API.G_EXC_ERROR ;
13691 -- END IF ;
13692 END IF ;
13693
13694 EXCEPTION
13695 WHEN FND_API.G_EXC_ERROR THEN
13696 ROLLBACK TO AbortWorkflow_Util ;
13697 x_return_status := FND_API.G_RET_STS_ERROR ;
13698
13699 FND_MSG_PUB.Count_And_Get
13700 ( p_count => x_msg_count
13701 , p_data => x_msg_data
13702 );
13703 END reassignRoutePeople;
13704
13705
13706 --
13707 -- R12B
13708 -- API name : GrantObjectRoles
13709 -- Type : Private
13710 -- Pre-reqs : None.
13711 -- Function : Grant Change Header/Line Subject Object Roles
13712 -- and OFO Roles on Attachment for Header/Line to WF Assignees
13713 -- Parameters :
13714 -- x_return_status OUT VARCHAR2
13715 -- x_msg_count OUT NUMBER
13716 -- x_msg_data OUT VARCHAR2
13717 --
13718 PROCEDURE GrantObjectRoles
13719 ( p_api_version IN NUMBER
13720 , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
13721 , p_commit IN VARCHAR2 := FND_API.G_FALSE
13722 , p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL
13723 , p_debug IN VARCHAR2 := FND_API.G_FALSE
13724 , p_output_dir IN VARCHAR2 := NULL
13725 , p_debug_filename IN VARCHAR2 := NULL
13726 , x_return_status OUT NOCOPY VARCHAR2
13727 , x_msg_count OUT NOCOPY NUMBER
13728 , x_msg_data OUT NOCOPY VARCHAR2
13729 , p_change_id IN NUMBER
13730 , p_change_line_id IN NUMBER
13731 , p_route_id IN NUMBER
13732 , p_step_id IN NUMBER
13733 , p_person_ids IN FND_TABLE_OF_NUMBER := NULL
13734 , p_target_objects IN FND_TABLE_OF_VARCHAR2_30 := NULL
13735 , p_api_caller IN VARCHAR2 := NULL
13736 , p_grant_option IN VARCHAR2 := NULL -- Optionnal
13737 )
13738 IS
13739
13740 l_api_name CONSTANT VARCHAR2(30) := 'GrantObjectRoles';
13741 l_api_version CONSTANT NUMBER := 1.0;
13742
13743 l_msg_count NUMBER ;
13744 l_msg_data VARCHAR2(2000) ;
13745 l_return_status VARCHAR2(1) ;
13746
13747 l_document_role_id NUMBER ;
13748 l_ocs_role VARCHAR2(250) ;
13749
13750 l_change_id NUMBER ;
13751 l_change_line_id NUMBER ;
13752 l_document_id NUMBER ;
13753 l_document_revision_id NUMBER ;
13754
13755 l_target_object_tbl FND_TABLE_OF_VARCHAR2_30 ;
13756 l_obj_idx PLS_INTEGER ;
13757
13758 l_doc_rev_person_id_tbl FND_TABLE_OF_NUMBER ;
13759 l_doc_rev_person_idx PLS_INTEGER ;
13760 l_ocs_person_id_tbl FND_TABLE_OF_NUMBER ;
13761 l_ocs_person_idx PLS_INTEGER ;
13762
13763 l_doc_rev_grant_flag BOOLEAN ;
13764 l_ocs_grant_flag BOOLEAN ;
13765
13766 l_attachment_entity_name VARCHAR2(40) ;
13767 l_attachment_pk1value VARCHAR2(100) ;
13768
13769 l_base_cm_type_code VARCHAR2(40);
13770 l_attachment_ids FND_TABLE_OF_NUMBER;
13771 l_repository_ids FND_TABLE_OF_NUMBER;
13772 l_source_mdedia_ids FND_TABLE_OF_NUMBER;
13773 l_sumitted_by NUMBER;
13774
13775
13776 CURSOR c_step_assignees ( c_step_id NUMBER )
13777 IS
13778 SELECT RoutePeople.STEP_ID
13779 , RoutePeople.ASSIGNEE_ID
13780 , RoutePeople.ASSIGNEE_TYPE_CODE
13781 , RoutePeople.ADHOC_PEOPLE_FLAG
13782 , RoutePeople.ORIGINAL_ASSIGNEE_ID
13783 , RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE
13784 , RoutePeople.RESPONSE_CONDITION_CODE
13785 , TO_CHAR(NULL) ORIG_ROLE_OBJECT_NAME
13786 , TO_NUMBER(NULL) ORIG_ROLE_OBJECT_ID
13787 FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
13788 WHERE RoutePeople.ASSIGNEE_TYPE_CODE = 'PERSON'
13789 AND RoutePeople.ASSIGNEE_ID <> -1
13790 AND RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE <> 'ROLE'
13791 AND ( RoutePeople.RESPONSE_CODE IS NULL
13792 OR RoutePeople.RESPONSE_CODE = G_RT_NOT_RECEIVED
13793 OR RoutePeople.RESPONSE_CODE = G_RT_SUBMITTED
13794 )
13795 AND RoutePeople.STEP_ID = c_step_id
13796 UNION ALL
13797 SELECT RoutePeople.STEP_ID
13798 , RoutePeople.ASSIGNEE_ID
13799 , RoutePeople.ASSIGNEE_TYPE_CODE
13800 , RoutePeople.ADHOC_PEOPLE_FLAG
13801 , RoutePeople.ORIGINAL_ASSIGNEE_ID
13802 , RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE
13803 , RoutePeople.RESPONSE_CONDITION_CODE
13804 , fnd_obj.OBJ_NAME ORIG_ROLE_OBJECT_NAME
13805 , fnd_obj.OBJECT_ID ORIG_ROLE_OBJECT_ID
13806 FROM FND_FORM_FUNCTIONS fnd_func
13807 , FND_MENU_ENTRIES fnd_menu
13808 , FND_OBJECTS fnd_obj
13809 , ENG_CHANGE_ROUTE_PEOPLE RoutePeople
13810 WHERE fnd_obj.OBJECT_ID = fnd_func.OBJECT_ID
13811 AND fnd_func.FUNCTION_ID = fnd_menu.FUNCTION_ID
13812 AND fnd_menu.MENU_ID = ORIGINAL_ASSIGNEE_ID
13813 AND ( RoutePeople.RESPONSE_CODE IS NULL
13814 OR RoutePeople.RESPONSE_CODE = G_RT_NOT_RECEIVED
13815 OR RoutePeople.RESPONSE_CODE = G_RT_SUBMITTED
13816 )
13817 AND RoutePeople.ASSIGNEE_TYPE_CODE = 'PERSON'
13818 AND RoutePeople.ASSIGNEE_ID <> -1
13819 AND RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE = 'ROLE'
13820 AND RoutePeople.STEP_ID = c_step_id ;
13821
13822
13823
13824 -- Future, this SQL should be dynmic SQL
13825 CURSOR c_chg_objects ( c_change_id NUMBER, c_change_line_id NUMBER)
13826 IS
13827 SELECT ChangeSubj.ENTITY_NAME CHANGE_OBJECT_NAME
13828 , ChangeSubj.PK1_VALUE
13829 , ChangeSubj.PK2_VALUE
13830 , ChangeSubj.PK3_VALUE
13831 , ChangeSubj.PK4_VALUE
13832 , ChangeSubj.PK5_VALUE
13833 , ChangeSubj.CHANGE_ID
13834 , ChangeSubj.CHANGE_LINE_ID
13835 FROM ENG_CHANGE_SUBJECTS ChangeSubj
13836 , FND_OBJECTS FndObj
13837 WHERE ChangeSubj.ENTITY_NAME = FndObj.OBJ_NAME
13838 AND ChangeSubj.CHANGE_ID = c_change_id
13839 AND ( ChangeSubj.CHANGE_LINE_ID = c_change_line_id
13840 OR (ChangeSubj.CHANGE_LINE_ID IS NULL
13841 AND c_change_line_id = -1)
13842 )
13843 AND FndObj.OBJ_NAME = G_DOM_DOCUMENT_REVISION ; -- R12B We only support G_DOM_DOCUMENT_REVISION
13844
13845 -- For future, if we need to support Item Role in this approach too.
13846 -- For now, comment out
13847 --
13848 -- UNION
13849 -- SELECT 'EGO_ITEM' CHANGE_OBJECT_NAME
13850 -- , ChangeCompSubj.PK1_VALUE
13851 -- , ChangeCompSubj.PK2_VALUE
13852 -- , ChangeCompSubj.PK3_VALUE
13853 -- , ChangeCompSubj.PK4_VALUE
13854 -- , ChangeCompSubj.PK5_VALUE
13855 -- , ChangeCompSubj.CHANGE_ID
13856 -- , ChangeCompSubj.CHANGE_LINE_ID
13857 -- FROM ENG_CHANGE_SUBJECTS ChangeCompSubj
13858 -- WHERE ChangeCompSubj.ENTITY_NAME = 'EGO_COMPONENT'
13859 -- AND ChangeCompSubj.CHANGE_ID = :c_change_id
13860 -- AND ( ChangeCompSubj.CHANGE_LINE_ID = :c_change_line_id
13861 -- OR ( ChangeCompSubj.CHANGE_LINE_ID IS NULL
13862 -- AND :c_change_line_id = -1)
13863 -- ) ) WHERE CHANGE_OBJECT_NAME IN ('EGO_ITEM') ;
13864 --
13865
13866
13867 BEGIN
13868 -- Standard Start of API savepoint
13869 SAVEPOINT GrantObjectRoles;
13870
13871 -- Standard call to check for call compatibility.
13872 IF NOT FND_API.Compatible_API_Call( l_api_version
13873 , p_api_version
13874 , l_api_name
13875 , G_PKG_NAME )
13876 THEN
13877 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13878 END IF;
13879
13880 -- Initialize message list if p_init_msg_list is set to TRUE.
13881 IF FND_API.to_Boolean( p_init_msg_list ) THEN
13882 FND_MSG_PUB.initialize;
13883 END IF ;
13884
13885
13886 -- For Test/Debug
13887 IF FND_API.to_Boolean( p_debug ) THEN
13888 Open_Debug_Session(p_output_dir, p_debug_filename ) ;
13889 END IF ;
13890
13891
13892 IF g_debug_flag THEN
13893 Write_Debug('Eng_Workflow_Util.GrantObjectRoles Log');
13894 Write_Debug('-----------------------------------------------------');
13895 Write_Debug('Change Id : ' || TO_CHAR(p_change_id) );
13896 Write_Debug('Change Line Id : ' || TO_CHAR(p_change_line_id) );
13897 Write_Debug('Route Id : ' || TO_CHAR(p_route_id));
13898 Write_Debug('Step Id : ' || TO_CHAR(p_step_id));
13899 Write_Debug('API Caller : ' || p_api_caller);
13900 Write_Debug('Grant Option : ' || p_grant_option);
13901 Write_Debug('-----------------------------------------------------');
13902 Write_Debug('Initialize return status ' );
13903 END IF ;
13904
13905 -- Initialize API return status to success
13906 x_return_status := FND_API.G_RET_STS_SUCCESS;
13907 l_return_status := FND_API.G_RET_STS_SUCCESS;
13908
13909 l_target_object_tbl := FND_TABLE_OF_VARCHAR2_30() ;
13910 l_obj_idx := 0 ;
13911
13912 l_doc_rev_person_id_tbl := FND_TABLE_OF_NUMBER() ;
13913 l_doc_rev_person_idx := 0 ;
13914 l_ocs_person_id_tbl := FND_TABLE_OF_NUMBER() ;
13915 l_ocs_person_idx := 0 ;
13916
13917 l_change_id := p_change_id ;
13918 l_change_line_id := p_change_line_id ;
13919
13920
13921
13922 IF g_debug_flag THEN
13923 Write_Debug('Check Attachment Entity . . .');
13924 Write_Debug('Doc Role Id : ' || TO_CHAR(l_document_role_id) );
13925 Write_Debug('File, OCS Role : ' || l_ocs_role);
13926 END IF ;
13927
13928
13929 IF l_change_line_id IS NULL OR l_change_line_id <= 0
13930 THEN
13931 l_change_line_id := -1 ;
13932
13933 l_attachment_entity_name := 'ENG_ENGINEERING_CHANGES' ;
13934 l_attachment_pk1value := TO_CHAR(l_change_id) ;
13935 l_base_cm_type_code := GetBaseChangeMgmtTypeCode(p_change_id);
13936
13937 ELSE
13938
13939 l_attachment_entity_name := 'ENG_CHANGE_LINES' ;
13940 l_attachment_pk1value := TO_CHAR(l_change_line_id) ;
13941
13942 END IF ;
13943
13944
13945 IF g_debug_flag THEN
13946 Write_Debug('Attachment Entity : ' || l_attachment_entity_name );
13947 Write_Debug('Attachment PK1Value : ' || l_attachment_pk1value );
13948 END IF ;
13949
13950
13951 l_ocs_grant_flag := FALSE ;
13952 l_doc_rev_grant_flag := FALSE ;
13953
13954 -----------------------------------------------------------------
13955 -- API body
13956 -----------------------------------------------------------------
13957
13958 IF g_debug_flag THEN
13959 Write_Debug('1. Check p_target_objects parameter. . . ' );
13960 END IF ;
13961
13962 --
13963 -- 1. Check p_target_objects parameter
13964 -- If, it's NOT null, we don't need to check Change Header and Line Subject
13965 -- Otherwise, we will query the Change Header or Line Subjects and get Subject Objects
13966 -- plus OCS File. Construct local target objects tables
13967 --
13968 -- Note: IN R12B, anyway we support only DOM_DOCUMENT_REVISION and OCS File
13969 --
13970 IF ( p_target_objects IS NOT NULL AND p_target_objects.count > 0 )
13971 THEN
13972 FOR i in p_target_objects.first .. p_target_objects.last
13973 LOOP
13974 l_target_object_tbl.EXTEND ;
13975 l_obj_idx := l_obj_idx + 1;
13976 l_target_object_tbl(l_obj_idx):=p_target_objects(i) ;
13977
13978 IF (G_OCS_FILE = p_target_objects(i))
13979 THEN
13980 l_ocs_grant_flag := TRUE ;
13981
13982 IF g_debug_flag THEN
13983 Write_Debug(' OCS Grant Flag True . . . ' );
13984 END IF ;
13985
13986 ELSIF (G_DOM_DOCUMENT_REVISION = p_target_objects(i))
13987 THEN
13988 l_doc_rev_grant_flag := TRUE ;
13989
13990 IF g_debug_flag THEN
13991 Write_Debug(' DCO Rev Grant Flag True . . . ' );
13992 END IF ;
13993 END IF ;
13994
13995 END LOOP;
13996
13997
13998 ELSE
13999 --
14000 -- By Default we support the following objects in R12B
14001 --
14002 IF g_debug_flag THEN
14003 Write_Debug(' Target Object is Null. By Default we support the following objects. . . ' );
14004 END IF ;
14005
14006 -- OCS Files
14007 l_target_object_tbl.EXTEND ;
14008 l_obj_idx := l_obj_idx + 1;
14009 l_target_object_tbl(l_obj_idx) := G_OCS_FILE ;
14010 l_ocs_grant_flag := TRUE ;
14011
14012 IF g_debug_flag THEN
14013 Write_Debug(' OCS Grant Flag True . . . ' );
14014 END IF ;
14015
14016 -- G_DOM_DOCUMENT_REVISION
14017 l_target_object_tbl.EXTEND ;
14018 l_obj_idx := l_obj_idx + 1;
14019 l_target_object_tbl(l_obj_idx) := G_DOM_DOCUMENT_REVISION;
14020 l_doc_rev_grant_flag := TRUE ;
14021
14022 IF g_debug_flag THEN
14023 Write_Debug(' DCO Rev Grant Flag True . . . ' );
14024 END IF ;
14025
14026
14027 END IF ;
14028
14029 --
14030 -- 2. Get Auto Grants Roles specified in Workflow Definition
14031 --
14032 -- Note: IN R12B, anyway we support only DOM_DOCUMENT_REVISION and OCS File
14033 --
14034 --
14035 -- Get Step Activity Attributes for Auto Grants
14036 GetStepAutoGranatRoles
14037 ( p_step_id => p_step_id
14038 , x_document_role_id => l_document_role_id
14039 , x_ocs_role => l_ocs_role ) ;
14040
14041
14042 IF g_debug_flag THEN
14043 Write_Debug('Get Auto Grants Roles specified in Workflow Definition. . .');
14044 Write_Debug('Doc Role Id : ' || TO_CHAR(l_document_role_id) );
14045 Write_Debug('File, OCS Role : ' || l_ocs_role);
14046 END IF ;
14047
14048 IF (l_document_role_id IS NULL AND l_ocs_role IS NULL )
14049 THEN
14050
14051 IF g_debug_flag THEN
14052 Write_Debug('Any Roles for Auto Grants are not specified for this step process. Return.');
14053 END IF ;
14054 RETURN ;
14055
14056 END IF ;
14057
14058 --
14059 -- 3. Check p_person_ids parameter
14060 -- If, it's NOT null, we don't need to query assignees under given p_step_id
14061 -- Otherwise, we will query Workflow Step Assignees and construct person ids table
14062 --
14063 IF ( p_person_ids IS NOT NULL AND p_person_ids.count > 0 )
14064 THEN
14065
14066 FOR j in p_person_ids.first .. p_person_ids.last
14067 LOOP
14068 l_doc_rev_person_id_tbl.EXTEND ;
14069 l_doc_rev_person_idx := l_doc_rev_person_idx + 1;
14070 l_doc_rev_person_id_tbl(l_doc_rev_person_idx) := p_person_ids(j) ;
14071
14072 l_ocs_person_id_tbl.EXTEND ;
14073 l_ocs_person_idx := l_ocs_person_idx + 1;
14074 l_ocs_person_id_tbl(l_ocs_person_idx) := p_person_ids(j) ;
14075
14076 END LOOP;
14077
14078 ELSE
14079
14080 FOR rtp_rec IN c_step_assignees (c_step_id => p_step_id )
14081 LOOP
14082
14083 --
14084 -- Exclude the assignees derivded from DOM_DOUCMENT_REVISION Role
14085 --
14086 IF ( rtp_rec.orig_role_object_name IS NULL
14087 OR rtp_rec.orig_role_object_name <> G_DOM_DOCUMENT_REVISION
14088 )
14089 THEN
14090
14091 l_doc_rev_person_id_tbl.EXTEND ;
14092 l_doc_rev_person_idx := l_doc_rev_person_idx + 1;
14093 l_doc_rev_person_id_tbl(l_doc_rev_person_idx) := rtp_rec.assignee_id ;
14094
14095 END IF ;
14096
14097 l_ocs_person_id_tbl.EXTEND ;
14098 l_ocs_person_idx := l_ocs_person_idx + 1;
14099 l_ocs_person_id_tbl(l_ocs_person_idx) := rtp_rec.assignee_id ;
14100
14101 END LOOP ;
14102
14103 END IF ;
14104
14105 IF (l_doc_rev_grant_flag)
14106 THEN
14107
14108 --
14109 -- 4. Execute Query for Change Subject by given change id and change line id
14110 -- and iterlate the fetched row.
14111 -- Call insdividual API to grant the objects to assignees.
14112 --
14113 -- Note: IN R12B, anyway we support only DOM_DOCUMENT_REVISION and OCS File
14114 --
14115
14116
14117
14118 FOR c_chg_objects_rec IN c_chg_objects ( c_change_id => l_change_id
14119 , c_change_line_id => l_change_line_id
14120 )
14121 LOOP
14122 IF ( G_DOM_DOCUMENT_REVISION = c_chg_objects_rec.CHANGE_OBJECT_NAME
14123 AND l_document_role_id IS NOT NULL
14124 AND (l_doc_rev_person_id_tbl IS NOT NULL AND l_doc_rev_person_id_tbl.count > 0)
14125 )
14126 THEN
14127
14128 -- MK Comment Need to verify this PK1 is Revision Id or not
14129 l_document_id := TO_NUMBER(c_chg_objects_rec.PK1_VALUE) ;
14130 l_document_revision_id := TO_NUMBER(c_chg_objects_rec.PK2_VALUE) ;
14131
14132
14133 IF g_debug_flag THEN
14134 Write_Debug('Calling ENG_DOCUMENT_UTIL.Grant_Document_Role. . .' );
14135 END IF ;
14136
14137
14138 ENG_DOCUMENT_UTIL.Grant_Document_Role
14139 ( p_api_version => 1.0
14140 , p_init_msg_list => FND_API.G_FALSE --
14141 , p_commit => FND_API.G_FALSE --
14142 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
14143 , p_debug => p_debug
14144 , p_output_dir => p_output_dir
14145 , p_debug_filename => p_debug_filename
14146 , x_return_status => l_return_status
14147 , x_msg_count => l_msg_count
14148 , x_msg_data => l_msg_data
14149 , p_document_id => l_document_id -- Dom Document Id
14150 , p_document_revision_id => l_document_revision_id -- Dom Document Revision Id
14151 , p_change_id => l_change_id -- Change Id
14152 , p_change_line_id => l_change_line_id -- Change Line Id
14153 , p_party_ids => l_doc_rev_person_id_tbl -- Person's HZ_PARTIES.PARTY_ID Array
14154 , p_role_id => l_document_role_id -- Role Id to be granted
14155 , p_api_caller => p_api_caller -- Optionnal for future use
14156 ) ;
14157
14158
14159 IF g_debug_flag THEN
14160 Write_Debug('After calling ENG_DOCUMENT_UTIL.Grant_Document_Role: ' || l_return_status );
14161 END IF ;
14162
14163 --
14164 -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
14165 -- THEN
14166 -- RAISE FND_API.G_EXC_ERROR ;
14167 -- END IF ;
14168 --
14169
14170 END IF ;
14171 END LOOP ;
14172
14173
14174 END IF ; -- (l_doc_rev_grant_flag IS TRUE)
14175
14176 --
14177 -- 5. Call ENG_DOCUMENT_UTIL.Grant_Attachments_OCSRole
14178 -- to grant roles on Attachments
14179 --
14180
14181
14182 IF ( l_ocs_grant_flag
14183 AND l_ocs_role IS NOT NULL
14184 AND (l_ocs_person_id_tbl IS NOT NULL AND l_ocs_person_id_tbl.count > 0)
14185 )
14186 THEN
14187
14188 IF g_debug_flag THEN
14189 Write_Debug('Calling ENG_DOCUMENT_UTIL.Grant_Attachments_OCSRole. . .' );
14190
14191 END IF ;
14192 if (l_base_cm_type_code is not null
14193 and l_base_cm_type_code in ('ATTACHMENT_APPROVAL','ATTACHMENT_REVIEW') )
14194 then
14195 GetAttachmentChangeDetails( p_change_id => l_attachment_pk1value
14196 , x_source_media_id_tbl => l_source_mdedia_ids
14197 , x_attached_document_id_tbl => l_attachment_ids
14198 , x_repository_id_tbl => l_repository_ids
14199 , x_creator_user_id => l_sumitted_by
14200 );
14201
14202 end if;
14203
14204 ENG_DOCUMENT_UTIL.Grant_Attachments_OCSRole
14205 ( p_api_version => 1.0
14206 , p_init_msg_list => FND_API.G_FALSE --
14207 , p_commit => FND_API.G_FALSE --
14208 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
14209 , p_debug => p_debug
14210 , p_output_dir => p_output_dir
14211 , p_debug_filename => p_debug_filename
14212 , x_return_status => l_return_status
14213 , x_msg_count => l_msg_count
14214 , x_msg_data => l_msg_data
14215 , p_entity_name => l_attachment_entity_name -- ENG_ENGINEERING_CHANGES or ENG_CHANGE_LINES
14216 , p_pk1value => l_attachment_pk1value -- CHANGE_ID or CHANGE_LINE_ID
14217 , p_pk2value => NULL
14218 , p_pk3value => NULL
14219 , p_pk4value => NULL
14220 , p_pk5value => NULL
14221 , p_party_ids => l_ocs_person_id_tbl -- Person's HZ_PARTIES.PARTY_ID Array
14222 , p_ocs_role => l_ocs_role -- OCS Role to be granted
14223 , p_source_media_id_tbl => l_source_mdedia_ids
14224 , p_attachment_id_tbl => l_attachment_ids
14225 , p_repository_id_tbl => l_repository_ids
14226 , p_submitted_by => l_sumitted_by
14227 , p_api_caller => p_api_caller -- Optionnal for future use
14228 ) ;
14229
14230
14231
14232 IF g_debug_flag THEN
14233 Write_Debug('After ENG_DOCUMENT_UTIL.Grant_Attachments_OCSRole: ' || l_return_status );
14234 END IF ;
14235
14236 --
14237 -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
14238 -- THEN
14239 -- RAISE FND_API.G_EXC_ERROR ;
14240 -- END IF ;
14241 --
14242
14243
14244 END IF ;
14245
14246
14247
14248 IF g_debug_flag THEN
14249 Write_Debug('After executing GrantObjectRoles API Body') ;
14250 END IF ;
14251
14252
14253 -- Standard check of p_commit.
14254 IF FND_API.To_Boolean( p_commit ) THEN
14255
14256 IF g_debug_flag THEN
14257 Write_Debug('Do Commit.') ;
14258 END IF ;
14259
14260 COMMIT WORK;
14261
14262 END IF;
14263
14264 -- Standard call to get message count and if count is 1, get message info.
14265 FND_MSG_PUB.Count_And_Get
14266 ( p_count => x_msg_count
14267 , p_data => x_msg_data
14268 );
14269
14270 IF g_debug_flag THEN
14271 Write_Debug('Finish. Eng Of Proc') ;
14272 Close_Debug_Session ;
14273 END IF ;
14274
14275
14276 EXCEPTION
14277 WHEN FND_API.G_EXC_ERROR THEN
14278
14279 -- Standard check of p_commit.
14280 IF FND_API.To_Boolean( p_commit )
14281 THEN
14282 ROLLBACK TO GrantObjectRoles ;
14283 END IF ;
14284 x_return_status := FND_API.G_RET_STS_ERROR ;
14285
14286 FND_MSG_PUB.Count_And_Get
14287 ( p_count => x_msg_count
14288 , p_data => x_msg_data
14289 );
14290
14291 IF g_debug_flag THEN
14292 Write_Debug('Finish with Error.') ;
14293 Close_Debug_Session ;
14294 END IF ;
14295
14296 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
14297 -- Standard check of p_commit.
14298 IF FND_API.To_Boolean( p_commit )
14299 THEN
14300 ROLLBACK TO GrantObjectRoles ;
14301 IF g_debug_flag THEN
14302 Write_Debug('Rollback. . . ' );
14303 END IF ;
14304
14305 END IF ;
14306
14307 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
14308
14309 FND_MSG_PUB.Count_And_Get
14310 ( p_count => x_msg_count
14311 , p_data => x_msg_data
14312 );
14313
14314 IF g_debug_flag THEN
14315 Write_Debug('Finish with unxepcted error.') ;
14316 Close_Debug_Session ;
14317 END IF ;
14318
14319 WHEN OTHERS THEN
14320 -- Standard check of p_commit.
14321 IF FND_API.To_Boolean( p_commit )
14322 THEN
14323 ROLLBACK TO GrantObjectRoles ;
14324
14325 IF g_debug_flag THEN
14326 Write_Debug('Rollback. . . ' );
14327 END IF ;
14328
14329 END IF ;
14330 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
14331
14332 FND_MSG_PUB.Count_And_Get
14333 ( p_count => x_msg_count
14334 , p_data => x_msg_data
14335 );
14336
14337 IF FND_MSG_PUB.Check_Msg_Level
14338 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
14339 THEN
14340 FND_MSG_PUB.Add_Exc_Msg
14341 ( G_PKG_NAME
14342 , l_api_name
14343 );
14344 END IF;
14345
14346 FND_MSG_PUB.Count_And_Get
14347 ( p_count => x_msg_count
14348 , p_data => x_msg_data
14349 );
14350
14351 IF g_debug_flag THEN
14352 Write_Debug('Finish with system unxepcted error: '
14353 || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
14354 Close_Debug_Session ;
14355 END IF ;
14356
14357
14358 END GrantObjectRoles ;
14359
14360
14361 --
14362 -- R12B
14363 -- API name : RevokeObjectRoles
14364 -- Type : Private
14365 -- Pre-reqs : None.
14366 -- Function : Revoke Change Header/Line Subject Object Roles
14367 -- and OFO Roles on Attachment for Header/Line from WF Assignees
14368 -- This API is mainly called when Chagne Object or Change Line is cancelled.
14369 -- Parameters :
14370 -- x_return_status OUT VARCHAR2
14371 -- x_msg_count OUT NUMBER
14372 -- x_msg_data OUT VARCHAR2
14373 --
14374 -- p_revoke_option G_REVOKE_ALL will reovked object roles for Header and Lines
14375 -- G_REVOKE_HEADER will reovked object roles for Header
14376 -- G_REVOKE_LINE will reovked object roles for Line
14377 -- p_revoke_option default G_REVOKE_LINE
14378 --
14379 PROCEDURE RevokeObjectRoles
14380 ( p_api_version IN NUMBER --
14381 , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE --
14382 , p_commit IN VARCHAR2 := FND_API.G_FALSE --
14383 , p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL
14384 , p_debug IN VARCHAR2 := FND_API.G_FALSE --
14385 , p_output_dir IN VARCHAR2 := NULL
14386 , p_debug_filename IN VARCHAR2 := NULL
14387 , x_return_status OUT NOCOPY VARCHAR2 --
14388 , x_msg_count OUT NOCOPY NUMBER --
14389 , x_msg_data OUT NOCOPY VARCHAR2 --
14390 , p_change_id IN NUMBER -- Change Id
14391 , p_change_line_id IN NUMBER -- Change Line Id
14392 , p_person_ids IN FND_TABLE_OF_NUMBER := NULL
14393 , p_target_objects IN FND_TABLE_OF_VARCHAR2_30 := NULL
14394 , p_api_caller IN VARCHAR2 := NULL
14395 , p_revoke_option IN VARCHAR2 := NULL -- Optionnal: G_REVOKE_ALL
14396 )
14397 IS
14398 l_msg_count NUMBER ;
14399 l_msg_data VARCHAR2(2000) ;
14400 l_return_status VARCHAR2(1) ;
14401
14402 l_change_id NUMBER ;
14403 l_change_line_id NUMBER ;
14404 l_revoke_option VARCHAR2(30) ;
14405 l_route_id NUMBER ;
14406
14407
14408 CURSOR c_header_routes(c_change_id NUMBER)
14409 IS
14410 SELECT routes.OBJECT_ID1 CHANGE_ID
14411 , TO_NUMBER(NULL) CHANGE_LINE_ID
14412 , routes.ROUTE_ID
14413 FROM ENG_CHANGE_ROUTES routes
14414 WHERE routes.STATUS_CODE IN ( Eng_Workflow_Util.G_RT_REJECTED
14415 , Eng_Workflow_Util.G_RT_APPROVED
14416 , Eng_Workflow_Util.G_RT_COMPLETED
14417 , Eng_Workflow_Util.G_RT_TIME_OUT) -- G_RT_ABORTED was taken care by ABORT WF
14418 AND ( routes.TEMPLATE_FLAG = G_RT_INSTANCE
14419 OR routes.TEMPLATE_FLAG = G_RT_HISTORY)
14420 AND routes.OBJECT_NAME = G_ENG_CHANGE
14421 AND routes.OBJECT_ID1 = c_change_id ;
14422
14423
14424 CURSOR c_line_routes(c_change_id NUMBER, c_change_line_id NUMBER)
14425 IS
14426 SELECT chg_line.CHANGE_ID
14427 , chg_line.CHANGE_LINE_ID
14428 , line_routes.ROUTE_ID
14429 FROM ENG_CHANGE_ROUTES line_routes
14430 , ENG_CHANGE_LINES chg_line
14431 WHERE line_routes.STATUS_CODE IN ( Eng_Workflow_Util.G_RT_REJECTED
14432 , Eng_Workflow_Util.G_RT_APPROVED
14433 , Eng_Workflow_Util.G_RT_COMPLETED
14434 , Eng_Workflow_Util.G_RT_TIME_OUT ) -- G_RT_ABORTED was taken care by ABORT WF
14435 AND ( line_routes.TEMPLATE_FLAG = G_RT_INSTANCE
14436 OR line_routes.TEMPLATE_FLAG = G_RT_HISTORY)
14437 AND line_routes.object_id1 = chg_line.CHANGE_LINE_ID
14438 AND line_routes.OBJECT_NAME = G_ENG_CHANGE_LINE
14439 AND ( chg_line.CHANGE_LINE_ID = c_change_line_id OR c_change_line_id = -1)
14440 AND chg_line.CHANGE_ID = c_change_id ;
14441
14442
14443
14444 BEGIN
14445
14446 l_change_id := p_change_id ;
14447 l_change_line_id := p_change_line_id ;
14448
14449 IF l_change_line_id IS NULL OR l_change_line_id <= 0
14450 THEN
14451 l_change_line_id := -1 ;
14452 END IF ;
14453
14454 l_revoke_option := p_revoke_option ;
14455 IF l_revoke_option IS NULL
14456 THEN
14457 l_revoke_option := G_REVOKE_LINE ;
14458 END IF ;
14459
14460
14461 IF (l_revoke_option <> G_REVOKE_LINE)
14462 THEN
14463 FOR l_rec IN c_header_routes (c_change_id => l_change_id )
14464 LOOP
14465 l_route_id := l_rec.ROUTE_ID ;
14466
14467 IF g_debug_flag THEN
14468 Write_Debug('ENG_DOCUMENT_UTIL.RevokeObjectRoles For Header Route .' || TO_CHAR(l_route_id) );
14469 END IF ;
14470 BEGIN
14471 RevokeObjectRoles
14472 ( p_api_version => p_api_version
14473 , p_init_msg_list => FND_API.G_FALSE
14474 , p_commit => p_commit
14475 , p_validation_level => p_validation_level
14476 , p_debug => p_debug
14477 , p_output_dir => p_output_dir
14478 , p_debug_filename => p_debug_filename
14479 , x_return_status => l_return_status
14480 , x_msg_count => l_msg_count
14481 , x_msg_data => l_msg_data
14482 , p_change_id => p_change_id
14483 , p_change_line_id => p_change_line_id
14484 , p_route_id => l_route_id
14485 , p_person_ids => p_person_ids
14486 , p_target_objects => p_target_objects
14487 , p_api_caller => p_api_caller
14488 , p_revoke_option => p_revoke_option
14489 ) ;
14490
14491 IF g_debug_flag THEN
14492 Write_Debug('After ENG_DOCUMENT_UTIL.RevokeObjectRoles For Header Route.' || l_route_id );
14493 END IF ;
14494 EXCEPTION
14495 WHEN OTHERS THEN
14496 NULL ;
14497 END ;
14498
14499 IF l_return_status <> FND_API.G_RET_STS_SUCCESS
14500 THEN
14501 x_return_status := l_return_status ;
14502 x_msg_count := l_msg_count ;
14503 x_msg_data := l_msg_data ;
14504 RETURN ;
14505 END IF ;
14506 END LOOP ;
14507 END IF ; -- (p_revoke_option <> G_REVOKE_LINE)
14508
14509
14510 IF ( l_revoke_option = G_REVOKE_ALL OR l_revoke_option = G_REVOKE_LINE )
14511 THEN
14512
14513 FOR l_line_rec IN c_line_routes (c_change_id => l_change_id, c_change_line_id => l_change_line_id )
14514 LOOP
14515 l_route_id := l_line_rec.ROUTE_ID ;
14516
14517 IF g_debug_flag THEN
14518 Write_Debug('Calling ENG_DOCUMENT_UTIL.RevokeObjectRoles For Line .Route ' || TO_CHAR(l_route_id) );
14519 END IF ;
14520 BEGIN
14521 RevokeObjectRoles
14522 ( p_api_version => p_api_version
14523 , p_init_msg_list => FND_API.G_FALSE
14524 , p_commit => p_commit
14525 , p_validation_level => p_validation_level
14526 , p_debug => p_debug
14527 , p_output_dir => p_output_dir
14528 , p_debug_filename => p_debug_filename
14529 , x_return_status => l_return_status
14530 , x_msg_count => l_msg_count
14531 , x_msg_data => l_msg_data
14532 , p_change_id => p_change_id
14533 , p_change_line_id => p_change_line_id
14534 , p_route_id => l_route_id
14535 , p_person_ids => p_person_ids
14536 , p_target_objects => p_target_objects
14537 , p_api_caller => p_api_caller
14538 , p_revoke_option => p_revoke_option
14539 ) ;
14540
14541 IF g_debug_flag THEN
14542 Write_Debug('After ENG_DOCUMENT_UTIL.RevokeObjectRoles For Line Route.' || l_route_id );
14543 END IF ;
14544 EXCEPTION
14545 WHEN OTHERS THEN
14546 NULL ;
14547 END ;
14548
14549 IF l_return_status <> FND_API.G_RET_STS_SUCCESS
14550 THEN
14551 x_return_status := l_return_status ;
14552 x_msg_count := l_msg_count ;
14553 x_msg_data := l_msg_data ;
14554 RETURN ;
14555 END IF ;
14556 END LOOP ;
14557
14558 END IF ;
14559
14560 END RevokeObjectRoles ;
14561
14562
14563 --
14564 -- R12B
14565 -- API name : RevokeObjectRoles
14566 -- Type : Private
14567 -- Pre-reqs : None.
14568 -- Function : Revoke Change Header/Line Subject Object Roles
14569 -- and OFO Roles on Attachment for Header/Line from WF Assignees
14570 -- Parameters :
14571 -- x_return_status OUT VARCHAR2
14572 -- x_msg_count OUT NUMBER
14573 -- x_msg_data OUT VARCHAR2
14574 --
14575 PROCEDURE RevokeObjectRoles
14576 ( p_api_version IN NUMBER --
14577 , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE --
14578 , p_commit IN VARCHAR2 := FND_API.G_FALSE --
14579 , p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL
14580 , p_debug IN VARCHAR2 := FND_API.G_FALSE --
14581 , p_output_dir IN VARCHAR2 := NULL
14582 , p_debug_filename IN VARCHAR2 := NULL
14583 , x_return_status OUT NOCOPY VARCHAR2 --
14584 , x_msg_count OUT NOCOPY NUMBER --
14585 , x_msg_data OUT NOCOPY VARCHAR2 --
14586 , p_change_id IN NUMBER -- Change Id
14587 , p_change_line_id IN NUMBER -- Change Line Id
14588 , p_route_id IN NUMBER
14589 , p_person_ids IN FND_TABLE_OF_NUMBER := NULL
14590 , p_target_objects IN FND_TABLE_OF_VARCHAR2_30 := NULL
14591 , p_api_caller IN VARCHAR2 := NULL
14592 , p_revoke_option IN VARCHAR2 := NULL -- Optionnal
14593 )
14594 IS
14595
14596 l_msg_count NUMBER ;
14597 l_msg_data VARCHAR2(2000) ;
14598 l_return_status VARCHAR2(1) ;
14599
14600 l_step_id NUMBER ;
14601
14602
14603 CURSOR c_route_step( c_route_id NUMBER )
14604 IS
14605 SELECT RouteStep.STEP_ID
14606 FROM ENG_CHANGE_ROUTE_STEPS RouteStep
14607 WHERE ( RouteStep.STEP_STATUS_CODE <> Eng_Workflow_Util.G_RT_NOT_STARTED
14608 AND RouteStep.STEP_STATUS_CODE <> Eng_Workflow_Util.G_RT_IN_PROGRESS)
14609 AND RouteStep.ROUTE_ID = c_route_id ;
14610
14611
14612
14613 BEGIN
14614
14615 FOR l_rec IN c_route_step (c_route_id => p_route_id )
14616 LOOP
14617
14618 l_step_id := l_rec.STEP_ID ;
14619
14620 IF g_debug_flag THEN
14621 Write_Debug('ENG_DOCUMENT_UTIL.RevokeObjectRoles For Step.' || TO_CHAR(l_step_id) );
14622 END IF ;
14623 BEGIN
14624 RevokeObjectRoles
14625 ( p_api_version => p_api_version
14626 , p_init_msg_list => FND_API.G_FALSE
14627 , p_commit => p_commit
14628 , p_validation_level => p_validation_level
14629 , p_debug => p_debug
14630 , p_output_dir => p_output_dir
14631 , p_debug_filename => p_debug_filename
14632 , x_return_status => l_return_status
14633 , x_msg_count => l_msg_count
14634 , x_msg_data => l_msg_data
14635 , p_change_id => p_change_id
14636 , p_change_line_id => p_change_line_id
14637 , p_route_id => p_route_id
14638 , p_step_id => l_step_id
14639 , p_person_ids => p_person_ids
14640 , p_target_objects => p_target_objects
14641 , p_api_caller => p_api_caller
14642 , p_revoke_option => p_revoke_option
14643 ) ;
14644
14645 IF g_debug_flag THEN
14646 Write_Debug('After ENG_DOCUMENT_UTIL.RevokeObjectRoles For Step.' || l_rec.STEP_ID );
14647 END IF ;
14648 EXCEPTION
14649 WHEN OTHERS THEN
14650 NULL ;
14651 END ;
14652
14653 IF l_return_status <> FND_API.G_RET_STS_SUCCESS
14654 THEN
14655 x_return_status := l_return_status ;
14656 x_msg_count := l_msg_count ;
14657 x_msg_data := l_msg_data ;
14658 RETURN ;
14659 END IF ;
14660 END LOOP;
14661
14662
14663 END RevokeObjectRoles ;
14664
14665 --
14666 -- R12B
14667 -- API name : RevokeObjectRoles
14668 -- Type : Private
14669 -- Pre-reqs : None.
14670 -- Function : Revoke Change Header/Line Subject Object Roles
14671 -- and OFO Roles on Attachment for Header/Line from WF Assignees
14672 -- Parameters :
14673 -- x_return_status OUT VARCHAR2
14674 -- x_msg_count OUT NUMBER
14675 -- x_msg_data OUT VARCHAR2
14676 --
14677 PROCEDURE RevokeObjectRoles
14678 ( p_api_version IN NUMBER --
14679 , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE --
14680 , p_commit IN VARCHAR2 := FND_API.G_FALSE --
14681 , p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL
14682 , p_debug IN VARCHAR2 := FND_API.G_FALSE --
14683 , p_output_dir IN VARCHAR2 := NULL
14684 , p_debug_filename IN VARCHAR2 := NULL
14685 , x_return_status OUT NOCOPY VARCHAR2 --
14686 , x_msg_count OUT NOCOPY NUMBER --
14687 , x_msg_data OUT NOCOPY VARCHAR2 --
14688 , p_change_id IN NUMBER -- Change Id
14689 , p_change_line_id IN NUMBER -- Change Line Id
14690 , p_route_id IN NUMBER
14691 , p_step_id IN NUMBER
14692 , p_person_ids IN FND_TABLE_OF_NUMBER := NULL
14693 , p_target_objects IN FND_TABLE_OF_VARCHAR2_30 := NULL
14694 , p_api_caller IN VARCHAR2 := NULL
14695 , p_revoke_option IN VARCHAR2 := NULL -- Optionnal
14696 )
14697 IS
14698
14699 l_api_name CONSTANT VARCHAR2(30) := 'RevokeObjectRoles';
14700 l_api_version CONSTANT NUMBER := 1.0;
14701
14702 l_msg_count NUMBER ;
14703 l_msg_data VARCHAR2(2000) ;
14704 l_return_status VARCHAR2(1) ;
14705
14706 l_document_role_id NUMBER ;
14707 l_ocs_role VARCHAR2(250) ;
14708
14709 l_change_id NUMBER ;
14710 l_change_line_id NUMBER ;
14711
14712 l_document_id NUMBER ;
14713 l_document_revision_id NUMBER ;
14714
14715 l_target_object_tbl FND_TABLE_OF_VARCHAR2_30 ;
14716 l_obj_idx PLS_INTEGER ;
14717
14718 l_doc_rev_person_id_tbl FND_TABLE_OF_NUMBER ;
14719 l_doc_rev_person_idx PLS_INTEGER ;
14720 l_ocs_person_id_tbl FND_TABLE_OF_NUMBER ;
14721 l_ocs_person_idx PLS_INTEGER ;
14722
14723 l_doc_rev_revoke_flag BOOLEAN ;
14724 l_ocs_revoke_flag BOOLEAN ;
14725
14726 l_attachment_entity_name VARCHAR2(40) ;
14727 l_attachment_pk1value VARCHAR2(100) ;
14728
14729
14730 CURSOR c_step_assignees ( c_step_id NUMBER )
14731 IS
14732 SELECT RouteStep.ROUTE_ID
14733 , RoutePeople.STEP_ID
14734 , RoutePeople.ASSIGNEE_ID
14735 , RoutePeople.ASSIGNEE_TYPE_CODE
14736 , RoutePeople.ADHOC_PEOPLE_FLAG
14737 , RoutePeople.ORIGINAL_ASSIGNEE_ID
14738 , RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE
14739 , RoutePeople.RESPONSE_CONDITION_CODE
14740 , TO_CHAR(NULL) ORIG_ROLE_OBJECT_NAME
14741 , TO_NUMBER(NULL) ORIG_ROLE_OBJECT_ID
14742 FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
14743 , ENG_CHANGE_ROUTE_STEPS RouteStep
14744 WHERE RoutePeople.ASSIGNEE_TYPE_CODE = 'PERSON'
14745 AND RoutePeople.ASSIGNEE_ID <> -1
14746 AND RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE <> 'ROLE'
14747 AND RoutePeople.STEP_ID = RouteStep.STEP_ID
14748 AND ( RouteStep.STEP_STATUS_CODE <> Eng_Workflow_Util.G_RT_NOT_STARTED
14749 AND RouteStep.STEP_STATUS_CODE <> Eng_Workflow_Util.G_RT_IN_PROGRESS)
14750 AND RouteStep.STEP_ID = c_step_id
14751 UNION
14752 SELECT RouteStep.ROUTE_ID
14753 , RoutePeople.STEP_ID
14754 , RoutePeople.ASSIGNEE_ID
14755 , RoutePeople.ASSIGNEE_TYPE_CODE
14756 , RoutePeople.ADHOC_PEOPLE_FLAG
14757 , RoutePeople.ORIGINAL_ASSIGNEE_ID
14758 , RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE
14759 , RoutePeople.RESPONSE_CONDITION_CODE
14760 , fnd_obj.OBJ_NAME ORIG_ROLE_OBJECT_NAME
14761 , fnd_obj.OBJECT_ID ORIG_ROLE_OBJECT_ID
14762 FROM FND_FORM_FUNCTIONS fnd_func
14763 , FND_MENU_ENTRIES fnd_menu
14764 , FND_OBJECTS fnd_obj
14765 , ENG_CHANGE_ROUTE_PEOPLE RoutePeople
14766 , ENG_CHANGE_ROUTE_STEPS RouteStep
14767 WHERE fnd_obj.OBJECT_ID = fnd_func.OBJECT_ID
14768 AND fnd_func.FUNCTION_ID = fnd_menu.FUNCTION_ID
14769 AND fnd_menu.MENU_ID = ORIGINAL_ASSIGNEE_ID
14770 AND RoutePeople.ASSIGNEE_TYPE_CODE = 'PERSON'
14771 AND RoutePeople.ASSIGNEE_ID <> -1
14772 AND RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE = 'ROLE'
14773 AND RoutePeople.STEP_ID = RouteStep.STEP_ID
14774 AND ( RouteStep.STEP_STATUS_CODE <> Eng_Workflow_Util.G_RT_NOT_STARTED
14775 AND RouteStep.STEP_STATUS_CODE <> Eng_Workflow_Util.G_RT_IN_PROGRESS)
14776 AND RouteStep.STEP_ID = c_step_id ;
14777
14778
14779
14780 -- Future, this SQL should be dynmic SQL
14781 CURSOR c_chg_objects ( c_change_id NUMBER, c_change_line_id NUMBER)
14782 IS
14783 SELECT ChangeSubj.ENTITY_NAME CHANGE_OBJECT_NAME
14784 , ChangeSubj.PK1_VALUE
14785 , ChangeSubj.PK2_VALUE
14786 , ChangeSubj.PK3_VALUE
14787 , ChangeSubj.PK4_VALUE
14788 , ChangeSubj.PK5_VALUE
14789 , ChangeSubj.CHANGE_ID
14790 , ChangeSubj.CHANGE_LINE_ID
14791 FROM ENG_CHANGE_SUBJECTS ChangeSubj
14792 , FND_OBJECTS FndObj
14793 WHERE ChangeSubj.ENTITY_NAME = FndObj.OBJ_NAME
14794 AND ChangeSubj.CHANGE_ID = c_change_id
14795 AND ( ChangeSubj.CHANGE_LINE_ID = c_change_line_id
14796 OR (ChangeSubj.CHANGE_LINE_ID IS NULL
14797 AND c_change_line_id = -1)
14798 )
14799 AND FndObj.OBJ_NAME = G_DOM_DOCUMENT_REVISION ; -- R12B We only support G_DOM_DOCUMENT_REVISION
14800
14801 -- For future, if we need to support Item Role in this approach too.
14802 -- For now, comment out
14803 --
14804 -- UNION
14805 -- SELECT 'EGO_ITEM' CHANGE_OBJECT_NAME
14806 -- , ChangeCompSubj.PK1_VALUE
14807 -- , ChangeCompSubj.PK2_VALUE
14808 -- , ChangeCompSubj.PK3_VALUE
14809 -- , ChangeCompSubj.PK4_VALUE
14810 -- , ChangeCompSubj.PK5_VALUE
14811 -- , ChangeCompSubj.CHANGE_ID
14812 -- , ChangeCompSubj.CHANGE_LINE_ID
14813 -- FROM ENG_CHANGE_SUBJECTS ChangeCompSubj
14814 -- WHERE ChangeCompSubj.ENTITY_NAME = 'EGO_COMPONENT'
14815 -- AND ChangeCompSubj.CHANGE_ID = :c_change_id
14816 -- AND ( ChangeCompSubj.CHANGE_LINE_ID = :c_change_line_id
14817 -- OR ( ChangeCompSubj.CHANGE_LINE_ID IS NULL
14818 -- AND :c_change_line_id = -1)
14819 -- ) ) WHERE CHANGE_OBJECT_NAME IN ('EGO_ITEM') ;
14820 --
14821
14822
14823
14824 BEGIN
14825 -- Standard Start of API savepoint
14826 SAVEPOINT RevokeObjectRoles;
14827
14828 -- Standard call to check for call compatibility.
14829 IF NOT FND_API.Compatible_API_Call( l_api_version
14830 , p_api_version
14831 , l_api_name
14832 , G_PKG_NAME )
14833 THEN
14834 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14835 END IF;
14836
14837 -- Initialize message list if p_init_msg_list is set to TRUE.
14838 IF FND_API.to_Boolean( p_init_msg_list ) THEN
14839 FND_MSG_PUB.initialize;
14840 END IF ;
14841
14842
14843 -- For Test/Debug
14844 IF FND_API.to_Boolean( p_debug ) THEN
14845 Open_Debug_Session(p_output_dir, p_debug_filename ) ;
14846 END IF ;
14847
14848
14849 IF g_debug_flag THEN
14850 Write_Debug('Eng_Workflow_Util.RevokeObjectRoles Log');
14851 Write_Debug('-----------------------------------------------------');
14852 Write_Debug('Change Id : ' || TO_CHAR(p_change_id) );
14853 Write_Debug('Change Line Id : ' || TO_CHAR(p_change_line_id) );
14854 Write_Debug('Route Id : ' || TO_CHAR(p_route_id));
14855 Write_Debug('Step Id : ' || TO_CHAR(p_step_id));
14856 Write_Debug('API Caller : ' || p_api_caller);
14857 Write_Debug('Revoke Option : ' || p_revoke_option);
14858 Write_Debug('-----------------------------------------------------');
14859 Write_Debug('Initialize return status ' );
14860 END IF ;
14861
14862 -- Initialize API return status to success
14863 x_return_status := FND_API.G_RET_STS_SUCCESS;
14864 l_return_status := FND_API.G_RET_STS_SUCCESS;
14865
14866 l_target_object_tbl := FND_TABLE_OF_VARCHAR2_30() ;
14867 l_obj_idx := 0 ;
14868
14869 l_doc_rev_person_id_tbl := FND_TABLE_OF_NUMBER() ;
14870 l_doc_rev_person_idx := 0 ;
14871 l_ocs_person_id_tbl := FND_TABLE_OF_NUMBER() ;
14872 l_ocs_person_idx := 0 ;
14873
14874 l_change_id := p_change_id ;
14875 l_change_line_id := p_change_line_id ;
14876
14877 IF l_change_line_id IS NULL OR l_change_line_id <= 0
14878 THEN
14879
14880 l_change_line_id := -1 ;
14881
14882 l_attachment_entity_name := 'ENG_ENGINEERING_CHANGES' ;
14883 l_attachment_pk1value := TO_CHAR(l_change_id) ;
14884
14885 ELSE
14886 l_attachment_entity_name := 'ENG_CHANGE_LINES' ;
14887 l_attachment_pk1value := TO_CHAR(l_change_line_id) ;
14888 END IF ;
14889
14890 IF g_debug_flag THEN
14891 Write_Debug('Attachmetn Entity');
14892 Write_Debug('Entity Name : ' || l_attachment_entity_name );
14893 Write_Debug('Entity Id1 : ' || l_attachment_pk1value );
14894 END IF ;
14895
14896 l_ocs_revoke_flag := FALSE ;
14897 l_doc_rev_revoke_flag := FALSE ;
14898
14899 -----------------------------------------------------------------
14900 -- API body
14901 -----------------------------------------------------------------
14902
14903
14904 --
14905 -- 1. Check p_target_objects parameter
14906 -- If, it's NOT null, we don't need to check Change Header and Line Subject
14907 -- Otherwise, we will query the Change Header or Line Subjects and get Subject Objects
14908 -- plus OCS File. Construct local target objects tables
14909 --
14910 -- Note: IN R12B, anyway we support only DOM_DOCUMENT_REVISION and OCS File
14911 --
14912 IF ( p_target_objects IS NOT NULL AND p_target_objects.count > 0 )
14913 THEN
14914
14915
14916 IF g_debug_flag THEN
14917 Write_Debug('p_target_objects IS NOT NULL. . .');
14918 END IF ;
14919
14920
14921 FOR i in p_target_objects.first .. p_target_objects.last
14922 LOOP
14923
14924 IF g_debug_flag THEN
14925 Write_Debug('p_target_objects = ' || to_char(i) || ' : ' || p_target_objects(i) );
14926 END IF ;
14927 l_target_object_tbl.EXTEND ;
14928 l_obj_idx := l_obj_idx + 1 ;
14929 l_target_object_tbl(l_obj_idx) := p_target_objects(i) ;
14930
14931 IF (G_OCS_FILE = p_target_objects(i))
14932 THEN
14933 l_ocs_revoke_flag := TRUE ;
14934
14935 ELSIF (G_DOM_DOCUMENT_REVISION = p_target_objects(i))
14936 THEN
14937 l_doc_rev_revoke_flag := TRUE ;
14938
14939 END IF ;
14940
14941 END LOOP;
14942
14943
14944 ELSE
14945
14946
14947 IF g_debug_flag THEN
14948 Write_Debug('p_target_objects IS NULL. . .');
14949 END IF ;
14950
14951 --
14952 -- By Default we support the following objects in R12B
14953 --
14954 -- OCS Files
14955 l_target_object_tbl.EXTEND ;
14956 l_obj_idx := l_obj_idx + 1 ;
14957 l_target_object_tbl(l_obj_idx):= G_OCS_FILE ;
14958 l_ocs_revoke_flag := TRUE ;
14959
14960 -- G_DOM_DOCUMENT_REVISION
14961 l_target_object_tbl.EXTEND ;
14962 l_obj_idx := l_obj_idx + 1 ;
14963 l_target_object_tbl(l_obj_idx):= G_DOM_DOCUMENT_REVISION;
14964 l_doc_rev_revoke_flag := TRUE ;
14965
14966 END IF ;
14967
14968
14969 --
14970 -- We don't need to get Roles per discussion with DOM team
14971 -- DOM Security API should revoke the grants per entity or change object info
14972 -- and person ids.
14973 -- So if we face a performance issue, we should modify the logic to get all route and step
14974 -- people by one-query and call the API without getting Roles specified
14975 -- in WFT definition per Step Workflow Process
14976 --
14977 -- 2. Get Auto Grants Roles specified in Workflow Definition
14978 --
14979 -- Note: IN R12B, anyway we support only DOM_DOCUMENT_REVISION and OCS File
14980 --
14981 --
14982 -- Get Step Activity Attributes for Auto Grants
14983 GetStepAutoGranatRoles
14984 ( p_step_id => p_step_id
14985 , x_document_role_id => l_document_role_id
14986 , x_ocs_role => l_ocs_role ) ;
14987
14988
14989 IF g_debug_flag THEN
14990 Write_Debug('Get Auto Revoke Roles specified in Workflow Definition. . .');
14991 Write_Debug('Doc Role Id : ' || TO_CHAR(l_document_role_id) );
14992 Write_Debug('File, OCS Role : ' || l_ocs_role);
14993 END IF ;
14994
14995 IF (l_document_role_id IS NULL AND l_ocs_role IS NULL )
14996 THEN
14997
14998 IF g_debug_flag THEN
14999 Write_Debug('Any Roles for Auto Revoke are not specified for this step process. Return.');
15000 END IF ;
15001
15002 --
15003 -- Comment out this. Just in case
15004 -- RETURN ;
15005
15006 END IF ;
15007
15008 -- 3. Check p_person_ids parameter
15009 -- If, it's NOT null, we don't need to query assignees under given p_step_id
15010 -- Otherwise, we will query Workflow Step Assignees and construct person ids table
15011 --
15012 IF ( p_person_ids IS NOT NULL AND p_person_ids.count > 0 )
15013 THEN
15014
15015 FOR j in p_person_ids.first .. p_person_ids.last
15016 LOOP
15017 l_doc_rev_person_id_tbl.EXTEND ;
15018 l_doc_rev_person_idx := l_doc_rev_person_idx + 1 ;
15019 l_doc_rev_person_id_tbl(l_doc_rev_person_idx) := p_person_ids(j) ;
15020
15021 l_ocs_person_id_tbl.EXTEND ;
15022 l_ocs_person_idx := l_ocs_person_idx + 1;
15023 l_ocs_person_id_tbl(l_ocs_person_idx) := p_person_ids(j) ;
15024
15025 END LOOP;
15026
15027 ELSE
15028
15029 FOR rtp_rec IN c_step_assignees (c_step_id => p_step_id )
15030 LOOP
15031
15032 --
15033 -- Exclude the assignees derivded from DOM_DOUCMENT_REVISION Role
15034 --
15035 IF ( rtp_rec.orig_role_object_name IS NULL
15036 OR rtp_rec.orig_role_object_name <> G_DOM_DOCUMENT_REVISION
15037 )
15038 THEN
15039
15040 l_doc_rev_person_id_tbl.EXTEND ;
15041 l_doc_rev_person_idx := l_doc_rev_person_idx + 1 ;
15042 l_doc_rev_person_id_tbl(l_doc_rev_person_idx):= rtp_rec.assignee_id ;
15043
15044 END IF ;
15045
15046 l_ocs_person_id_tbl.EXTEND ;
15047 l_ocs_person_idx := l_ocs_person_idx + 1;
15048 l_ocs_person_id_tbl(l_ocs_person_idx):=rtp_rec.assignee_id ;
15049
15050 END LOOP ;
15051
15052 END IF ;
15053
15054
15055
15056 IF (l_doc_rev_revoke_flag)
15057 THEN
15058
15059 --
15060 -- 4. Execute Query for Change Subject by given change id and change line id
15061 -- and iterlate the fetched row.
15062 -- Call insdividual API to grant the objects to assignees.
15063 --
15064 -- Note: IN R12B, anyway we support only DOM_DOCUMENT_REVISION and OCS File
15065 --
15066 FOR c_chg_objects_rec IN c_chg_objects ( c_change_id => l_change_id
15067 , c_change_line_id => l_change_line_id
15068 )
15069 LOOP
15070 IF ( G_DOM_DOCUMENT_REVISION = c_chg_objects_rec.CHANGE_OBJECT_NAME
15071 AND l_document_role_id IS NOT NULL
15072 AND (l_doc_rev_person_id_tbl IS NOT NULL AND l_doc_rev_person_id_tbl.count > 0)
15073 )
15074 THEN
15075
15076 -- MK Comment Need to verify this PK1 is Revision Id or not
15077 l_document_id := TO_NUMBER(c_chg_objects_rec.PK1_VALUE) ;
15078 l_document_revision_id := TO_NUMBER(c_chg_objects_rec.PK2_VALUE) ;
15079
15080 IF g_debug_flag THEN
15081 Write_Debug('Calling ENG_DOCUMENT_UTIL.Revoke_Document_Role . . . ');
15082 END IF ;
15083
15084 ENG_DOCUMENT_UTIL.Revoke_Document_Role
15085 ( p_api_version => 1.0
15086 , p_init_msg_list => FND_API.G_FALSE --
15087 , p_commit => FND_API.G_FALSE --
15088 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
15089 , p_debug => p_debug
15090 , p_output_dir => p_output_dir
15091 , p_debug_filename => p_debug_filename
15092 , x_return_status => l_return_status
15093 , x_msg_count => l_msg_count
15094 , x_msg_data => l_msg_data
15095 , p_document_id => l_document_id -- Dom Document Id
15096 , p_document_revision_id => l_document_revision_id -- Dom Document Revision Id
15097 , p_change_id => l_change_id -- Change Id
15098 , p_change_line_id => l_change_line_id -- Change Line Id
15099 , p_party_ids => l_doc_rev_person_id_tbl -- Person's HZ_PARTIES.PARTY_ID Array
15100 , p_role_id => l_document_role_id -- Role Id to be granted
15101 , p_api_caller => p_api_caller -- Optionnal for future use
15102 ) ;
15103
15104
15105
15106 IF g_debug_flag THEN
15107 Write_Debug('After ENG_DOCUMENT_UTIL.Revoke_Document_Role: ' || l_return_status );
15108 END IF ;
15109
15110 --
15111 -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
15112 -- THEN
15113 -- RAISE FND_API.G_EXC_ERROR ;
15114 -- END IF ;
15115 --
15116
15117 END IF ;
15118 END LOOP ;
15119
15120
15121 END IF ; -- (l_doc_rev_revoke_flag IS TRUE)
15122
15123 --
15124 -- 5. Call ENG_DOCUMENT_UTIL.Grant_Attachments_OCSRole
15125 -- to grant roles on Attachments
15126 --
15127 IF ( l_ocs_revoke_flag
15128 AND l_ocs_role IS NOT NULL
15129 AND (l_ocs_person_id_tbl IS NOT NULL AND l_ocs_person_id_tbl.count > 0)
15130 )
15131 THEN
15132
15133 IF g_debug_flag THEN
15134 Write_Debug('Calling ENG_DOCUMENT_UTIL.Revoke_Attachments_OCSRole . . . ');
15135 END IF ;
15136
15137 ENG_DOCUMENT_UTIL.Revoke_Attachments_OCSRole
15138 ( p_api_version => 1.0
15139 , p_init_msg_list => FND_API.G_FALSE --
15140 , p_commit => FND_API.G_FALSE --
15141 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
15142 , p_debug => p_debug
15143 , p_output_dir => p_output_dir
15144 , p_debug_filename => p_debug_filename
15145 , x_return_status => l_return_status
15146 , x_msg_count => l_msg_count
15147 , x_msg_data => l_msg_data
15148 , p_entity_name => l_attachment_entity_name -- ENG_ENGINEERING_CHANGES or ENG_CHANGE_LINES
15149 , p_pk1value => l_attachment_pk1value -- CHANGE_ID or CHANGE_LINE_ID
15150 , p_pk2value => NULL
15151 , p_pk3value => NULL
15152 , p_pk4value => NULL
15153 , p_pk5value => NULL
15154 , p_party_ids => l_ocs_person_id_tbl -- Person's HZ_PARTIES.PARTY_ID Array
15155 , p_ocs_role => l_ocs_role -- OCS Role to be revoked
15156 , p_api_caller => p_api_caller -- Optionnal for future use
15157 ) ;
15158
15159
15160 IF g_debug_flag THEN
15161 Write_Debug('After ENG_DOCUMENT_UTIL.Revoke_Attachments_OCSRole: ' || l_return_status );
15162 END IF ;
15163
15164 --
15165 -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
15166 -- THEN
15167 -- RAISE FND_API.G_EXC_ERROR ;
15168 -- END IF ;
15169 --
15170
15171
15172 END IF ;
15173
15174
15175 -----------------------------------------------------------------
15176 -- END OF API body
15177 -----------------------------------------------------------------
15178
15179
15180 IF g_debug_flag THEN
15181 Write_Debug('After executing RevokeObjectRoles API Body') ;
15182 END IF ;
15183
15184
15185 -- Standard check of p_commit.
15186 IF FND_API.To_Boolean( p_commit ) THEN
15187
15188 IF g_debug_flag THEN
15189 Write_Debug('Do Commit.') ;
15190 END IF ;
15191
15192 COMMIT WORK;
15193
15194 END IF;
15195
15196 -- Standard call to get message count and if count is 1, get message info.
15197 FND_MSG_PUB.Count_And_Get
15198 ( p_count => x_msg_count
15199 , p_data => x_msg_data
15200 );
15201
15202 IF g_debug_flag THEN
15203 Write_Debug('Finish. Eng Of Proc') ;
15204 Close_Debug_Session ;
15205 END IF ;
15206
15207
15208 EXCEPTION
15209 WHEN FND_API.G_EXC_ERROR THEN
15210
15211 -- Standard check of p_commit.
15212 IF FND_API.To_Boolean( p_commit )
15213 THEN
15214 ROLLBACK TO RevokeObjectRoles ;
15215 END IF ;
15216 x_return_status := FND_API.G_RET_STS_ERROR ;
15217
15218 FND_MSG_PUB.Count_And_Get
15219 ( p_count => x_msg_count
15220 , p_data => x_msg_data
15221 );
15222
15223 IF g_debug_flag THEN
15224 Write_Debug('Finish with Error.') ;
15225 Close_Debug_Session ;
15226 END IF ;
15227
15228 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
15229 -- Standard check of p_commit.
15230 IF FND_API.To_Boolean( p_commit )
15231 THEN
15232 ROLLBACK TO RevokeObjectRoles ;
15233 IF g_debug_flag THEN
15234 Write_Debug('RollBack . . ..') ;
15235 END IF ;
15236 END IF ;
15237
15238 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
15239
15240 FND_MSG_PUB.Count_And_Get
15241 ( p_count => x_msg_count
15242 , p_data => x_msg_data
15243 );
15244
15245 IF g_debug_flag THEN
15246 Write_Debug('Finish with unxepcted error.') ;
15247 Close_Debug_Session ;
15248 END IF ;
15249
15250 WHEN OTHERS THEN
15251 -- Standard check of p_commit.
15252 IF FND_API.To_Boolean( p_commit )
15253 THEN
15254 ROLLBACK TO RevokeObjectRoles ;
15255 IF g_debug_flag THEN
15256 Write_Debug('RollBack . . ..') ;
15257 END IF ;
15258 END IF ;
15259
15260 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
15261
15262 FND_MSG_PUB.Count_And_Get
15263 ( p_count => x_msg_count
15264 , p_data => x_msg_data
15265 );
15266
15267 IF FND_MSG_PUB.Check_Msg_Level
15268 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
15269 THEN
15270 FND_MSG_PUB.Add_Exc_Msg
15271 ( G_PKG_NAME
15272 , l_api_name
15273 );
15274 END IF;
15275
15276 FND_MSG_PUB.Count_And_Get
15277 ( p_count => x_msg_count
15278 , p_data => x_msg_data
15279 );
15280
15281 IF g_debug_flag THEN
15282 Write_Debug('Finish with system unxepcted error: '
15283 || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
15284 Close_Debug_Session ;
15285 END IF ;
15286
15287
15288 END RevokeObjectRoles ;
15289
15290
15291 END Eng_Workflow_Util ;