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