[Home] [Help]
PACKAGE BODY: APPS.AMW_GEN_APPROVAL_PVT
Source
1 PACKAGE BODY AMW_GEN_APPROVAL_PVT as
2 /* $Header: amwvgapb.pls 120.0 2005/05/31 20:42:23 appldev noship $ */
3
4 G_PKG_NAME CONSTANT VARCHAR2(30) := 'amw_gen_approval_pvt';
5 g_file_name CONSTANT VARCHAR2 (15) := 'amwvgapb.pls' ;
6 G_ITEMTYPE CONSTANT varchar2(30) := 'AMWGAPP';
7
8 /*************************** PRIVATE ROUTINES *******************************/
9 -------------------------------------------------------------------------------
10 -- Start of Comments
11 -- NAME
12 -- Get_User_Role
13 --
14 -- PURPOSE
15 -- This Procedure will be return the User role for
16 -- the userid sent
17 -- Called By
18 -- NOTES
19 -- HISTORY
20 -- 6/4/2003 MUMU PANDE CREATION
21 -- 6/12/2003 KARTHI MUTHUSWAMY Modified the procedure to obtain the role name
22 -- and role display name based on FND User Id.
23 -- 6/25/2003 KARTHI MUTHUSWAMY Modified the procedure to obtain the Employee Id
24 -- from FND_USER.USER_ID
25 -- 06/30/2003 KARTHI MUTHUSWAMY Changed p_workflowprocess to p_workflow_process
26 -- End of Comments
27 -------------------------------------------------------------------------------
28 PROCEDURE Get_User_Role(
29 p_user_id IN NUMBER,
30 x_role_name OUT NOCOPY VARCHAR2,
31 x_role_display_name OUT NOCOPY VARCHAR2 ,
32 x_return_status OUT NOCOPY VARCHAR2) IS
33 l_employee_id FND_USER.EMPLOYEE_ID%TYPE ;
34 BEGIN
35 x_return_status := FND_API.G_RET_STS_SUCCESS;
36
37 /*
38 -- The parameter p_user_id is the FND_USER.USER_ID
39 -- Get the Person Id (which is the Employee Id) for this USER_ID
40 begin
41 select employee_id
42 into l_employee_id
43 from FND_USER
44 where user_id = p_user_id ;
45 exception
46 when no_data_found
47 then
48 x_return_status := FND_API.G_RET_STS_ERROR;
49 FND_MESSAGE.Set_Name('AMW','AMW_APPR_INVALID_ROLE');
50 FND_MSG_PUB.Add;
51
52 return ;
53 end ;
54 */
55
56 -- Pass the Employee Id (which is Person Id) to get the Role
57 WF_DIRECTORY.getrolename(
58 p_orig_system => 'PER',
59 p_orig_system_id => p_user_id ,
60 p_name => x_role_name,
61 p_display_name => x_role_display_name );
62
63 IF x_role_name is null
64 then
65 x_return_status := FND_API.G_RET_STS_ERROR;
66 FND_MESSAGE.Set_Name('AMW','AMW_APPR_INVALID_ROLE');
67 FND_MSG_PUB.Add;
68 END IF;
69 END Get_User_Role;
70 -------------------------------------------------------------------------------
71 --
72 -- Checks gets the person id
73 --
74 -------------------------------------------------------------------------------
75
76 PROCEDURE get_person_id(
77 p_user_id IN NUMBER,
78 x_person_id OUT NOCOPY NUMBER,
79 x_return_status OUT NOCOPY VARCHAR2)
80 IS
81 CURSOR c_person_id IS
82 select employee_id
83 from FND_USER
84 where user_id = p_user_id ;
85 -- Obtain and populate the Role Name and Display Name from the USER ID
86 BEGIN
87 x_return_status := FND_API.G_RET_STS_SUCCESS;
88 OPEN c_person_id ;
89 FETCH c_person_id INTO x_person_id ;
90 CLOSE c_person_id;
91 exception
92 when no_data_found
93 then
94 x_return_status := FND_API.G_RET_STS_ERROR;
95 FND_MESSAGE.Set_Name('AMW','AMW_APPR_INVALID_ROLE');
96 FND_MSG_PUB.Add;
97 RAISE FND_API.G_EXC_ERROR;
98 end ;
99
100
101 -------------------------------------------------------------------------------
102 --
103 -- Checks if there are more approvers
104 --
105 -------------------------------------------------------------------------------
106 PROCEDURE Check_Approval_Required(
107 p_OBJECT_type IN VARCHAR2,
108 p_OBJECT_id IN NUMBER,
109 x_required_flag OUT NOCOPY VARCHAR2)
110 IS
111
112
113 BEGIN
114
115 x_required_flag := FND_API.G_TRUE;
116
117 END Check_Approval_Required;
118
119 -------------------------------------------------------------------------------
120 -- Start of Comments
121 --
122 -- NAME
123 -- HANDLE_ERR
124 --
125 -- PURPOSE
126 -- This Procedure will Get all the Errors from the Message stack and
127 -- set it to the workflow error message attribute
128 -- It also sets the subject for the generic error message wf attribute
129 -- The generic error message body wf attribute is set in the
130 -- ntf_requestor_of_error procedure
131 --
132 -- NOTES
133 --
134 -- End of Comments
135 -------------------------------------------------------------------------------
136
137 PROCEDURE Handle_Err
138 (p_itemtype IN VARCHAR2 ,
139 p_itemkey IN VARCHAR2 ,
140 p_msg_count IN NUMBER , -- Number of error Messages
141 p_msg_data IN VARCHAR2 ,
142 p_attr_name IN VARCHAR2,
143 x_error_msg OUT NOCOPY VARCHAR2
144 )
145 IS
146 l_msg_count NUMBER ;
147 l_msg_data VARCHAR2(2000);
148 l_final_data VARCHAR2(4000);
149 l_msg_index NUMBER ;
150 l_cnt NUMBER := 0 ;
151 l_appr_meaning VARCHAR2(240);
152 l_appr_obj_name VARCHAR2(240);
153 l_gen_err_sub VARCHAR2(240);
154 BEGIN
155 -- Retriveing Error Message from FND_MSG_PUB
156 -- Called by most of the procedures if it encounter error
157 WHILE l_cnt < p_msg_count
158 LOOP
159 FND_MSG_PUB.Get
160 (p_msg_index => l_cnt + 1,
161 p_encoded => FND_API.G_FALSE,
162 p_data => l_msg_data,
163 p_msg_index_out => l_msg_index ) ;
164 l_final_data := l_final_data ||l_msg_index||': '
165 ||l_msg_data||fnd_global.local_chr(10) ;
166 l_cnt := l_cnt + 1 ;
167 END LOOP ;
168 x_error_msg := l_final_data;
169 WF_ENGINE.SetItemAttrText
170 (itemtype => p_itemtype,
171 itemkey => p_itemkey ,
172 aname => p_attr_name,
173 avalue => l_final_data );
174 --
175 l_appr_meaning := wf_engine.GetItemAttrText(
176 itemtype => p_itemtype,
177 itemkey => p_itemkey,
178 aname => 'AMW_APPROVAL_OBJECT_MEANING');
179
180 l_appr_obj_name := wf_engine.GetItemAttrText(
181 itemtype => p_itemtype,
182 itemkey => p_itemkey,
183 aname => 'AMW_APPROVAL_OBJECT_NAME');
184 --
185 fnd_message.set_name ('AMW', 'AMW_GEN_NTF_ERROR_SUB');
186 fnd_message.set_token ('OBJ_MEANING', l_appr_meaning, FALSE);
187 fnd_message.set_token ('OBJ_NAME', l_appr_obj_name, FALSE);
188
189 l_gen_err_sub := SUBSTR(fnd_message.get,1,240);
190
191 Wf_Engine.SetItemAttrText
192 (itemtype => p_itemtype,
193 itemkey => p_itemkey ,
194 aname => 'ERR_SUBJECT',
195 avalue => l_gen_err_sub );
196 END Handle_Err;
197
198 /*****************************************************************
199 -- Start of Comments
200 -- NAME
201 -- StartProcess
202 -- PURPOSE
203 -- This Procedure will Start the flow
204 --
205 -- Used By Objects
206 -- p_OBJECT_type OBJECT Type or Objects
207 -- (CAMP,DELV,EVEO,EVEH .. )
208 -- p_OBJECT_id Primary key of the Object
209 -- p_approval_type BUDGET,CONCEPT
210 -- p_OBJECT_version_number Object Version Number
211 -- p_orig_stat_id The status to which is
212 -- to be reverted if process fails
213 -- p_new_stat_id The status to which it is
214 -- to be updated if the process succeeds
215 -- p_reject_stat_id The status to which is
216 -- to be updated if the process fails
217 -- p_requestor_userid The requestor who has submitted the
218 -- process
219 -- p_notes_from_requestor Notes from the requestor
220 -- p_workflow_process Name of the workflow process
221 -- AMW_CONCEPT_APPROVAL -- For Concept
222 -- AMW_APPROVAL -- For Budget Approvals
223 -- p_item_type AMWGAPP
224 -- NOTES
225 -- Item key generated as combination of OBJECT Type, OBJECT Id, and Object
226 -- Version Number.
227 -- For ex. RISK100007 where 7 is OBJECT version number and 10000 OBJECT id
228 -- HISTORY
229 -- 5/28/2003 mpande CREATED
230 -- End of Comments
231 *****************************************************************/
232
233 PROCEDURE StartProcess
234 (p_OBJECT_type IN VARCHAR2,
235 p_OBJECT_id IN NUMBER,
236 p_approval_type IN VARCHAR2 DEFAULT NULL ,
237 p_OBJECT_version_number IN NUMBER,
238 p_requestor_userid IN NUMBER,
239 p_workflow_process IN VARCHAR2 DEFAULT NULL,
240 p_item_type IN VARCHAR2 DEFAULT NULL,
241 p_gen_process_flag IN VARCHAR2 DEFAULT NULL,
242 x_return_status out nocopy varchar2,
243 x_msg_count out nocopy number,
244 x_msg_data out nocopy varchar2
245
246 )
247 IS
248 L_API_NAME CONSTANT VARCHAR2(30) := 'start_Process';
249 itemtype VARCHAR2(30) := nvl(p_item_type,'AMWGAPP');
250 itemkey VARCHAR2(30) := p_approval_type||p_OBJECT_type||p_OBJECT_id||
251 p_OBJECT_version_number;
252 itemuserkey VARCHAR2(80) := p_OBJECT_type||p_OBJECT_id||
253 p_OBJECT_version_number;
254
255 l_requestor_role VARCHAR2(320) ; -- Changed from VARCHAR2(100)
256 l_role_display_name VARCHAR2(360) ; -- Changed from VARCHAR2(240);
257 l_requestor_id NUMBER ;
258 l_employee_id NUMBER ;
259 l_appr_for VARCHAR2(240) ;
260 l_appr_meaning VARCHAR2(240);
261 l_return_status VARCHAR2(1);
262 l_msg_count NUMBER;
263 l_msg_data VARCHAR2(4000);
264 l_error_msg VARCHAR2(4000);
265 l_index NUMBER;
266 l_save_threshold NUMBER := wf_engine.threshold;
267
268 ---npanandi added this for timeout profile value.
269 l_timeout_profile NUMBER;
270
271
272 CURSOR c_resource IS
273 SELECT 1 -- resource_id ,employee_id source_id,full_name resource_name change
274 FROM dual ;
275 -- WHERE user_id = x_resource_id ; need to change
276 BEGIN
277 --FND_MSG_PUB.initialize();
278 savepoint start_process ;
279 x_return_status := FND_API.g_ret_sts_success;
280
281 AMW_Utility_PVT.debug_message('Start :Item Type : '||itemtype
282 ||' Item key : '||itemkey);
283
284 -- wf_engine.threshold := -1;
285 WF_ENGINE.CreateProcess (itemtype => itemtype,
286 itemkey => itemkey ,
287 process => p_workflow_process);
288
289 WF_ENGINE.SetItemUserkey(itemtype => itemtype,
290 itemkey => itemkey ,
291 userkey => itemuserkey);
292
293 /*****************************************************************
294 Initialize Workflow Item Attributes
295 *****************************************************************/
296
297
298
299 -- OBJECT Type (Some of valid values are 'RISK, 'CTRL', etc.,,);
300 WF_ENGINE.SetItemAttrText(itemtype => itemtype ,
301 itemkey => itemkey,
302 aname => 'AMW_OBJECT_TYPE',
303 avalue => p_OBJECT_type );
304
305 -- OBJECT ID (primary Id of OBJECT Object)
306 WF_ENGINE.SetItemAttrNumber(itemtype => itemtype ,
307 itemkey => itemkey,
308 aname => 'AMW_OBJECT_ID',
309 avalue => p_OBJECT_id );
310
311 ---npanandi added 10/20/2004 to set timeout variable
312 /*
313 l_timeout_profile := NVL(fnd_profile.VALUE ('AMW_DELT_CTRL_INTF'), 'N');
314 INSTEAD OF HARDCODING THE TIMEOUT ATTRIBUTE VALUE, LOOK IT UP FROM THE BELOW
315 PROFILE AND SET THE ATTRIBUTE VALUE ACCORDINGLY
316 ACCORDING TO WORKFLOW DOCUMENTATION
317 'A null timeout value or a value of zero means no timeout.' --> FOR THOSE
318 CUSTOMERS THAT DO NOT WANT TIMEOUT AT ALL, THEY MAY SET THIS VALUE TO BE NULL
319 */
320 l_timeout_profile := fnd_profile.VALUE ('AMW_APPROVAL_TIMEOUT_VALUE');
321 FND_FILE.PUT_LINE(FND_FILE.LOG, 'L_TIMEOUT_PROFILE IN DAYS: '||L_TIMEOUT_PROFILE);
322 IF(L_TIMEOUT_PROFILE IS NOT NULL) THEN
323 ---CONVERT THE PROFILE VALUE FROM DAYS TO MINUTES
324 L_TIMEOUT_PROFILE := (L_TIMEOUT_PROFILE) * 1440;
325 END IF;
326 FND_FILE.PUT_LINE(FND_FILE.LOG, 'L_TIMEOUT_PROFILE IN MINUTES: '||L_TIMEOUT_PROFILE);
327 WF_ENGINE.SetItemAttrNumber(itemtype => itemtype ,
328 itemkey => itemkey,
329 aname => 'AMW_NOTIFICATION_TIMEOUT',
330 avalue => l_timeout_profile);
331 ---npanandi ended
332
333 -- Object Version Number
334 WF_ENGINE.SetItemAttrNumber(itemtype => itemtype,
335 itemkey => itemkey,
336 aname => 'AMW_OBJECT_VERSION_NUMBER',
337 avalue => p_OBJECT_version_number );
338 /*
339 -- Notes from the requestor
340 WF_ENGINE.SetItemAttrText(itemtype => itemtype,
341 itemkey => itemkey,
342 aname => 'AMW_NOTES_FROM_REQUESTOR',
343 avalue => nvl(p_notes_from_requestor,'') );
344 */
345 WF_ENGINE.SetItemAttrText(itemtype => itemtype,
346 itemkey => itemkey,
347 aname => 'DOCUMENT_ID',
348 avalue => itemtype || ':' ||itemkey);
349
350 WF_ENGINE.SetItemAttrNumber(itemtype => itemtype,
351 itemkey => itemkey,
352 aname => 'AMW_REQUESTOR_ID',
353 avalue => p_requestor_userid );
354
355 WF_ENGINE.SetItemAttrText(itemtype => itemtype ,
356 itemkey => itemkey,
357 aname => 'AMW_APPROVAL_TYPE',
358 avalue => p_approval_type );
359
360 l_return_status := FND_API.G_RET_STS_SUCCESS;
361
362 get_person_id(
363 p_user_id =>p_requestor_userid,
364 x_person_id =>l_employee_id,
365 x_return_status =>l_return_status);
366
367 IF l_return_status <> FND_API.G_RET_STS_SUCCESS then
368 RAISE FND_API.G_EXC_ERROR;
369 END IF;
370
371 -- Pass the Employee Id (which is Person Id) to get the Role
372 WF_DIRECTORY.getrolename(
373 p_orig_system => 'PER',
374 p_orig_system_id => l_employee_id ,
375 p_name => l_requestor_role ,
376 p_display_name => l_role_display_name );
377
378
382 avalue => l_requestor_role );
379 WF_ENGINE.SetItemAttrText(itemtype => itemtype,
380 itemkey => itemkey,
381 aname => 'AMW_REQUESTOR',
383
384
385 WF_ENGINE.SetItemAttrText(itemtype => itemtype ,
386 itemkey => itemkey,
387 aname => 'AMW_GENERIC_FLAG',
388 avalue => p_gen_process_flag );
389
390 WF_ENGINE.SetItemOwner(itemtype => itemtype,
391 itemkey => itemkey,
392 owner => l_requestor_role);
393
394 -- Start the Process
395 WF_ENGINE.StartProcess (itemtype => itemtype,
396 itemkey => itemkey);
397
398 -- wf_engine.threshold := l_save_threshold ;
399 EXCEPTION
400
401 WHEN FND_API.G_EXC_ERROR THEN
402 ROLLBACK TO start_process;
403 x_return_status := FND_API.G_RET_STS_ERROR;
404 -- Standard call to get message count and if count=1, get the message
405 FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE,p_count => x_msg_count,p_data => x_msg_data);
406
407 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
408 ROLLBACK TO start_process;
409 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
410 -- Standard call to get message count and if count=1, get the message
411 FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE,p_count => x_msg_count,p_data => x_msg_data);
412
413 WHEN OTHERS THEN
414 ROLLBACK TO start_process;
415 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
416 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
417 THEN
418 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,l_api_name);
419 END IF;
420 -- Standard call to get message count and if count=1, get the message
421 FND_MSG_PUB.Count_And_Get (p_encoded => FND_API.G_FALSE,p_count => x_msg_count,p_data => x_msg_data);
422
423 END StartProcess;
424
425 /*****************************************************************
426 -- Start of Comments
427 --
428 -- NAME
429 -- set_object_details
430 --
431 -- PURPOSE
432 -- NOTES
433 -- HISTORY
434 -- End of Comments
435 *****************************************************************/
436
437 PROCEDURE Set_OBJECT_Details(itemtype IN VARCHAR2,
438 itemkey IN VARCHAR2,
439 actid IN NUMBER,
440 funcmode IN VARCHAR2,
441 resultout OUT NOCOPY VARCHAR2) IS
442
443
444 l_OBJECT_id NUMBER;
445 l_OBJECT_type VARCHAR2(30);
446 l_approval_type VARCHAR2(30);
447 l_msg_count NUMBER;
448 l_msg_data VARCHAR2(4000);
449 l_error_msg VARCHAR2(4000);
450 l_pkg_name varchar2(80);
451 l_proc_name varchar2(80);
452 l_return_stat varchar2(1);
453 dml_str VARCHAR2(2000);
454
455 BEGIN
456 FND_MSG_PUB.initialize();
457 IF (funcmode = 'RUN') THEN
458 -- get the acitvity id
459 l_OBJECT_id := wf_engine.GetItemAttrNumber(
460 itemtype => itemtype,
461 itemkey => itemkey,
462 aname => 'AMW_OBJECT_ID' );
463
464 -- get the OBJECT type
465 l_OBJECT_type := wf_engine.GetItemAttrText(
466 itemtype => itemtype,
467 itemkey => itemkey,
468 aname => 'AMW_OBJECT_TYPE' );
469
470 l_approval_type := wf_engine.GetItemAttrText(
471 itemtype => itemtype,
472 itemkey => itemkey,
473 aname => 'AMW_APPROVAL_TYPE' );
474
475 Get_Api_Name('WORKFLOW', l_OBJECT_type, 'SET_OBJECT_DETAILS', l_approval_type, l_pkg_name, l_proc_name, l_return_stat);
476
477 IF (l_return_stat = 'S') THEN
478 dml_str := 'BEGIN ' || l_pkg_name||'.'||l_proc_name||'(:itemtype,:itemkey,:actid,:funcmode,:resultout); END;';
479 EXECUTE IMMEDIATE dml_str USING IN itemtype,IN itemkey,IN actid,IN funcmode, OUT resultout;
480
481 resultout := 'COMPLETE:SUCCESS';
482
483 return ;
484 ELSE
485 RAISE FND_API.G_EXC_ERROR;
486 END IF;
487
488 END IF;
489
490 --
491 -- CANCEL mode
492 --
493 IF (funcmode = 'CANCEL') THEN
494 resultout := 'COMPLETE:';
495 return;
496 END IF;
497
498 --
499 -- TIMEOUT mode
500 --
501 IF (funcmode = 'TIMEOUT') THEN
502 resultout := 'COMPLETE:';
503 return;
504 END IF;
505 --
506
507 EXCEPTION
508 WHEN FND_API.G_EXC_ERROR THEN
509 wf_core.context('amw_gen_approval_pvt','Set_OBJECT_Details',
510 itemtype,itemkey,actid,funcmode,l_error_msg);
511 raise;
512 WHEN OTHERS THEN
513 FND_MSG_PUB.Count_And_Get (
514 p_encoded => FND_API.G_FALSE,
515 p_count => l_msg_count,
519 (p_itemtype => itemtype ,
516 p_data => l_msg_data
517 );
518 Handle_Err
520 p_itemkey => itemkey ,
521 p_msg_count => l_msg_count, -- Number of error Messages
522 p_msg_data => l_msg_data ,
523 p_attr_name => 'AMW_ERROR_MSG',
524 x_error_msg => l_error_msg
525 ) ;
526 wf_core.context('amw_approval_pvt','Set_OBJECT_Details',
527 itemtype,itemkey,actid,funcmode,l_error_msg);
528 raise;
529 END Set_OBJECT_Details ;
530
531 -------------------------------------------------------------------------------
532 -- Start of Comments
533 --
534 -- NAME
535 -- Set_Approver_Details
536 --
537 -- PURPOSE
538 -- This procedure will set the next approver details. These details are obtained
539 -- by making a call to the Approvals Manager. If the Approvals Manager does not
540 -- return value, the object is approved and the procedure will return with a 'COMPLETE'
541 -- status.
542 -- NOTES
543 -- HISTORY
544 -- 6/4/2003 MUMU PANDE CREATION
545 -- 6/12/2003 KARTHI MUTHUSWAMY Added code to call Approvals Manager
546 -- 6/24/2003 KARTHI MUTHUSWAMY Added code to skip approval if profile option is set
547 -- End of Comments
548 -------------------------------------------------------------------------------
549
550 PROCEDURE Set_Approver_Details( itemtype in varchar2,
551 itemkey in varchar2,
552 actid in number,
553 funcmode in varchar2,
554 resultout OUT NOCOPY varchar2 )
555 IS
556 l_OBJECT_type VARCHAR2(80);
557 l_approver_id NUMBER;
558 l_approver VARCHAR2(320); -- Was VARCHAR2(100);
559 l_prev_approver VARCHAR2(320); -- Was VARCHAR2(100);
560 l_approver_display_name VARCHAR2(360); -- Was VARCHAR2(80)
561 l_notification_type VARCHAR2(30);
562 l_notification_timeout NUMBER;
563 l_approver_type VARCHAR2(30);
564 l_role_name VARCHAR2(100); --l_role_name VARCHAR2(30);
565 l_prev_role_name VARCHAR2(100); --l_prev_role_name VARCHAR2(30);
566 l_OBJECT_approver_id NUMBER;
567 l_return_status VARCHAR2(1);
568 l_msg_count NUMBER;
569 l_msg_data VARCHAR2(4000);
570 l_error_msg VARCHAR2(4000);
571 l_pkg_name varchar2(80);
572 l_proc_name varchar2(80);
573 l_appr_id NUMBER;
574 dml_str VARCHAR2(2000);
575 l_version NUMBER;
576 l_approval_type VARCHAR2(30);
577 l_OBJECT_id NUMBER;
578 l_appr_type VARCHAR2(30);
579 l_obj_appr_id NUMBER;
580 l_prev_approver_disp_name VARCHAR2(360);
581 l_note VARCHAR2(4000);
582 l_object_approval_status VARCHAR2 (20) := null ;
583 l_disable_workflow VARCHAR2 (10) ;
584 l_nextApprover ame_util.approverRecord;
585
586
587 BEGIN
588 FND_MSG_PUB.initialize();
589 IF (funcmode = 'RUN')
590 THEN
591 -- Check if the AMW_DISABLE_WORKFLOW_APPROVAL profile option is set.
592 -- If it set to 'Y' skip the approval process and update the object
593 -- status as "Approved"
594 l_disable_workflow := fnd_profile.value( 'AMW_DISABLE_WORKFLOW_APPROVAL' ) ;
595
596 if ( l_disable_workflow = 'Y' )
597 then
598 resultout := 'COMPLETE:COMPLETE' ;
599
600 return ;
601 end if ;
602
603 l_OBJECT_id := Wf_Engine.GetItemAttrNumber(
604 itemtype => itemtype,
605 itemkey => itemkey,
606 aname => 'AMW_OBJECT_ID' );
607
608 l_OBJECT_type := Wf_Engine.GetItemAttrText(
609 itemtype => itemtype,
610 itemkey => itemkey,
611 aname => 'AMW_OBJECT_TYPE' );
612
613 l_version := Wf_Engine.GetItemAttrNumber(
614 itemtype => itemtype,
615 itemkey => itemkey,
616 aname => 'AMW_OBJECT_VERSION_NUMBER' );
617
618 l_approval_type := Wf_Engine.GetItemAttrText(
619 itemtype => itemtype,
620 itemkey => itemkey,
621 aname => 'AMW_APPROVAL_TYPE' );
622
623 -- To start with the value of AMW_APPROVER_ID item attribute will be NULL
624 l_object_approver_id := wf_engine.GetItemAttrNumber(
625 itemtype => itemtype,
626 itemkey => itemkey,
627 aname => 'AMW_APPROVER_ID' ) ;
628
629 -- Obtain the value of UPDATE_GEN_STATUS item attribute
630 -- The very first entry into this activity this value will be NULL
631 l_object_approval_status := WF_ENGINE.GetItemAttrText(
632 itemtype => itemtype,
633 itemkey => itemkey,
634 aname => 'UPDATE_GEN_STATUS' ) ;
635
639 IF ( l_object_approval_status = 'APPROVED' )
636 -- This activity is re-visited whenever the Object is 'Approved' and
637 -- needs to go up the chain for further approval
638
640 THEN
641 -- we need to call AME API to update the approver status
642 AME_API.updateApprovalStatus2(
643 applicationIdIn => 242,
644 transactionIdIn => l_OBJECT_id,
645 approvalStatusIn => AME_UTIL.approvedStatus,
646 approverPersonIdIn => l_object_approver_id,
647 approverUserIdIn => NULL,
648 transactionTypeIn => l_OBJECT_type ) ;
649 END IF ;
650 /*
651 WF_ENGINE.SetItemAttrText(itemtype => itemtype ,
652 itemkey => itemkey,
653 aname => 'APPROVAL_NOTE',
654 avalue => 'ObjInfo:' || l_OBJECT_id || l_object_type );
655 */
656 ame_api.getNextApprover( applicationIdIn => 242,
657 transactionIdIn => l_OBJECT_id,
658 transactionTypeIn => l_OBJECT_type,
659 nextApproverOut => l_nextapprover ) ;
660
661 -- Check the results returned from Approvals Manager
662 IF ( l_nextApprover.person_id is null ) and ( l_nextApprover.user_id is null )
663 and ( l_nextApprover.approval_status is null ) THEN
664 -- 2 options either, there are no more approvers in the approver list
665 -- or no appprovers are returned by OAM
666 -- for now, the transaction is approved
667 resultout := 'COMPLETE:COMPLETE' ;
668
669 WF_ENGINE.SetItemAttrText(itemtype => itemtype ,
670 itemkey => itemkey,
671 aname => 'AMW_ERROR_MSG',
672 avalue => 'No More Approvers' );
673
674 RETURN ;
675 ELSIF ( l_nextApprover.approval_status = ame_util.exceptionStatus ) THEN
676 -- an error has occurred and Approvals Manager may return the admin approver
677 -- or it may just return a exception status. Write to log that there is an error
678
679 WF_ENGINE.SetItemAttrText(itemtype => itemtype ,
680 itemkey => itemkey,
681 aname => 'AMW_ERROR_MSG',
682 avalue => 'Exception Status:' || l_nextApprover.approval_status );
683 resultout := 'COMPLETE:ERROR' ;
684
685 RETURN ;
686 /**********PENDING***************/
687 -- Check for the person id
688 -- If ( Person Id is not null ) continue
689 -- If it is null check if User Id is not null and convert user id to person Id
690 /**********PENDING***************/
691 ELSIF ( l_nextApprover.person_id is not null )
692 THEN
693 -- Approvals Manager returned the next approver's person id
694 l_OBJECT_approver_id := l_nextApprover.person_id ;
695
696 WF_ENGINE.SetItemAttrText(itemtype => itemtype ,
697 itemkey => itemkey,
698 aname => 'UPDATE_GEN_STATUS',
699 avalue => 'APPROVED' );
700 WF_ENGINE.SetItemAttrText(itemtype => itemtype ,
701 itemkey => itemkey,
702 aname => 'AMW_ERROR_MSG',
703 avalue => 'Got Person Id:' || l_OBJECT_approver_id );
704
705 ELSIF ( l_nextApprover.user_id is not null )
706 THEN
707 -- Approvals Manager returned the next approver's user id
708 l_OBJECT_approver_id := l_nextApprover.user_id ;
709 WF_ENGINE.SetItemAttrText(itemtype => itemtype ,
710 itemkey => itemkey,
711 aname => 'UPDATE_GEN_STATUS',
712 avalue => 'APPROVED' );
713
714 get_person_id(
715 p_user_id =>l_nextApprover.user_id,
716 x_person_id =>l_OBJECT_approver_id,
717 x_return_status =>l_return_status);
718
719 WF_ENGINE.SetItemAttrText(itemtype => itemtype ,
720 itemkey => itemkey,
721 aname => 'AMW_ERROR_MSG',
722 avalue => 'Got User Id:' || l_OBJECT_approver_id );
723 END IF ;
724
725 Get_User_Role(p_user_id => l_OBJECT_approver_id, -- the person id
726 x_role_name => l_approver,
727 x_role_display_name => l_approver_display_name,
728 x_return_status => l_return_status ) ;
729
730 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
731 RAISE FND_API.G_EXC_ERROR ;
732 END IF ;
733
734 -- Get the current approver's display name, person who just approved the object
735 l_prev_approver_disp_name := wf_engine.GetItemAttrText(
736 itemtype => itemtype,
737 itemkey => itemkey,
738 aname => 'AMW_APPROVER_DISPLAY_NAME' );
739
740 -- Set the person who currently approved to previous approver display name
741 wf_engine.SetItemAttrText( itemtype => itemtype,
745
742 itemkey => itemkey,
743 aname => 'AMW_PREV_APPROVER_DISP_NAME',
744 avalue => l_prev_approver_disp_name);
746 -- Get the current approver's approval note
747 l_note := wf_engine.GetItemAttrText(itemtype => itemtype,
748 itemkey => itemkey,
749 aname => 'APPROVAL_NOTE');
750
751 -- Set the current approver's notes to previous approval note
752 wf_engine.SetItemAttrText( itemtype => itemtype,
753 itemkey => itemkey,
754 aname => 'AMW_PREV_APPROVER_NOTE',
755 avalue => l_note);
756
757 -- Clear the value in approval note so that the next approval does not see the previous values
758 wf_engine.SetItemAttrText( itemtype => itemtype,
759 itemkey => itemkey,
760 aname => 'APPROVAL_NOTE',
761 avalue => null);
762
763 -- Set the next approver's display name obtained from Get_User_Role()
764 wf_engine.SetItemAttrText( itemtype => itemtype,
765 itemkey => itemkey,
766 aname => 'AMW_APPROVER_DISPLAY_NAME',
767 avalue => l_approver_display_name);
768
769 -- Set the next approver's role name obtained from Get_User_Role()
770 wf_engine.SetItemAttrText( itemtype => itemtype,
771 itemkey => itemkey,
772 aname => 'AMW_APPROVER',
773 avalue => l_approver);
774
775 -- Set the next approver's id obtained from Get_User_Role()
776 wf_engine.SetItemAttrNumber(itemtype => itemtype,
777 itemkey => itemkey,
778 aname => 'AMW_APPROVER_ID',
779 avalue => l_OBJECT_approver_id);
780
781 resultout := 'COMPLETE:SUCCESS';
782
783 return ;
784 END IF;
785 --
786 -- CANCEL mode
787 --
788 IF (funcmode = 'CANCEL') THEN
789 resultout := 'COMPLETE:';
790 return;
791 END IF;
792
793 --
794 -- TIMEOUT mode
795 --
796 IF (funcmode = 'TIMEOUT') THEN
797 resultout := 'COMPLETE:';
798 return;
799 END IF;
800
801 EXCEPTION
802 WHEN FND_API.G_EXC_ERROR THEN
803 FND_MSG_PUB.Count_And_Get (
804 p_encoded => FND_API.G_FALSE,
805 p_count => l_msg_count,
806 p_data => l_msg_data
807 );
808 Handle_Err
809 (p_itemtype => itemtype ,
810 p_itemkey => itemkey ,
811 p_msg_count => l_msg_count, -- Number of error Messages
812 p_msg_data => l_msg_data ,
813 p_attr_name => 'AMW_ERROR_MSG',
814 x_error_msg => l_error_msg
815 );
816 wf_core.context('amw_gen_approval_pvt',
817 'set_approval_rules',
818 itemtype, itemkey,to_char(actid),l_error_msg);
819 resultout := 'COMPLETE:ERROR';
820 --RAISE;
821 WHEN OTHERS THEN
822 FND_MSG_PUB.Count_And_Get (
823 p_encoded => FND_API.G_FALSE,
824 p_count => l_msg_count,
825 p_data => l_msg_data
826 );
827 Handle_Err
828 (p_itemtype => itemtype ,
829 p_itemkey => itemkey ,
830 p_msg_count => l_msg_count, -- Number of error Messages
831 p_msg_data => l_msg_data ,
832 p_attr_name => 'AMW_ERROR_MSG',
833 x_error_msg => l_error_msg
834 ) ;
835 wf_core.context('amw_gen_approval_pvt',
836 'set_approver_details',
837 itemtype, itemkey,to_char(actid),l_error_msg);
838 RAISE;
839 END;
840 /*
841 -------------------------------------------------------------------------------
842 --
843 -- Set_Further_Approvals
844 --
845 -------------------------------------------------------------------------------
846
847 PROCEDURE Set_Further_Approvals( itemtype in varchar2,
848 itemkey in varchar2,
849 actid in number,
850 funcmode in varchar2,
851 resultout OUT NOCOPY varchar2 )
852 IS
853 l_current_seq NUMBER;
854 l_next_seq NUMBER;
855 l_approval_detail_id NUMBER;
856 l_required_flag VARCHAR2(1);
857 l_approver_id NUMBER;
858 l_note VARCHAR2(4000);
859 l_all_note VARCHAR2(4000);
860 l_OBJECT_type VARCHAR2(30);
861 l_OBJECT_id NUMBER;
862 l_msg_count NUMBER;
863 l_msg_data VARCHAR2(4000);
864 l_return_status VARCHAR2(1);
865 l_error_msg VARCHAR2(4000);
866 -- 11.5.9
867 l_version NUMBER;
868 l_approval_type VARCHAR2(30);
869
870 BEGIN
874 itemtype => itemtype,
871 FND_MSG_PUB.initialize();
872 IF (funcmode = 'RUN') THEN
873 l_approval_detail_id := wf_engine.GetItemAttrNumber(
875 itemkey => itemkey,
876 aname => 'AMW_APPROVAL_DETAIL_ID' );
877
878 l_current_seq := wf_engine.GetItemAttrText(
879 itemtype => itemtype,
880 itemkey => itemkey,
881 aname => 'AMW_APPROVER_SEQ' );
882
883 l_approver_id := wf_engine.GetItemAttrNumber(
884 itemtype => itemtype,
885 itemkey => itemkey,
886 aname => 'AMW_APPROVER_ID' );
887
888 l_OBJECT_id := wf_engine.GetItemAttrNumber(
889 itemtype => itemtype,
890 itemkey => itemkey,
891 aname => 'AMW_OBJECT_ID' );
892
893 l_OBJECT_type := wf_engine.GetItemAttrText(
894 itemtype => itemtype,
895 itemkey => itemkey,
896 aname => 'AMW_OBJECT_TYPE' );
897
898 -- Added for 11.5.9
899 -- Bug 2535600
900 wf_engine.SetItemAttrText( itemtype => itemtype,
901 itemkey => itemkey,
902 aname => 'AMW_APPROVAL_DATE',
903 avalue => trunc(sysdate));
904
905 l_version := Wf_Engine.GetItemAttrNumber(
906 itemtype => itemtype,
907 itemkey => itemkey,
908 aname => 'AMW_OBJECT_VERSION_NUMBER' );
909
910 l_approval_type := Wf_Engine.GetItemAttrText(
911 itemtype => itemtype,
912 itemkey => itemkey,
913 aname => 'AMW_APPROVAL_TYPE' );
914
915 l_note := Wf_Engine.GetItemAttrText(
916 itemtype => itemtype,
917 itemkey => itemkey,
918 aname => 'APPROVAL_NOTE' );
919
920
921 Check_Approval_Required
922 ( p_approval_detail_id => l_approval_detail_id,
923 p_current_seq => l_current_seq,
924 x_next_seq => l_next_seq,
925 x_required_flag => l_required_flag);
926 IF l_next_seq is not null THEN
927 wf_engine.SetItemAttrNumber(itemtype => itemtype,
928 itemkey => itemkey,
929 aname => 'AMW_APPROVER_SEQ',
930 avalue => l_next_seq);
931 resultout := 'COMPLETE:Y';
932 ELSE
933 resultout := 'COMPLETE:N';
934 END IF;
935 END IF;
936
937 --
938 -- CANCEL mode
939 --
940 IF (funcmode = 'CANCEL') THEN
941 resultout := 'COMPLETE:';
942 return;
943 END IF;
944
945 --
946 -- TIMEOUT mode
947 --
948 IF (funcmode = 'TIMEOUT') THEN
949 resultout := 'COMPLETE:';
950 return;
951 END IF;
952 EXCEPTION
953 WHEN FND_API.G_EXC_ERROR THEN
954 FND_MSG_PUB.Count_And_Get (
955 p_encoded => FND_API.G_FALSE,
956 p_count => l_msg_count,
957 p_data => l_msg_data
958 );
959 Handle_Err
960 (p_itemtype => itemtype ,
961 p_itemkey => itemkey ,
962 p_msg_count => l_msg_count, -- Number of error Messages
963 p_msg_data => l_msg_data ,
964 p_attr_name => 'AMW_ERROR_MSG',
965 x_error_msg => l_error_msg
966 ) ;
967 wf_core.context('amw_gen_approval_pvt',
968 'set_further_approvals',
969 itemtype, itemkey,to_char(actid),l_error_msg);
970 RAISE;
971 WHEN OTHERS THEN
972 FND_MSG_PUB.Count_And_Get (
973 p_encoded => FND_API.G_FALSE,
974 p_count => l_msg_count,
975 p_data => l_msg_data
976 );
977 Handle_Err
978 (p_itemtype => itemtype ,
979 p_itemkey => itemkey ,
980 p_msg_count => l_msg_count, -- Number of error Messages
981 p_msg_data => l_msg_data ,
982 p_attr_name => 'AMW_ERROR_MSG',
983 x_error_msg => l_error_msg
984 ) ;
985 wf_core.context('amw_gen_approval_pvt',
986 'set_further_approvals',
987 itemtype, itemkey,to_char(actid),l_error_msg);
988 RAISE;
989 --
990
991 END;
992 */
993 -------------------------------------------------------------------------------
994 -- Start of Comments
995 --
996 -- NAME
997 -- Revert_Status
998 --
999 -- PARAMETERS
1000 -- itemtype (varchar2)
1004 -- reultout (varchar2)
1001 -- itemkey (varchar2)
1002 -- actid (number)
1003 -- funcmode (number)
1005 -- PURPOSE
1006 -- This procedure is called from the "Revert Object Status" function activity.
1007 -- It sets the 'UPDATE_GEN_STATUS' item attribute to "ERROR" and calls
1008 -- Update_Status().
1009 -- NOTES
1010 -- HISTORY
1011 -- 6/4/2003 MUMU PANDE CREATION
1012 -- 6/17/2003 KARTHI MUTHUSWAMY Added comments
1013 -- End of Comments
1014 -------------------------------------------------------------------------------
1015 PROCEDURE Revert_Status( itemtype in varchar2,
1016 itemkey in varchar2,
1017 actid in number,
1018 funcmode in varchar2,
1019 resultout OUT NOCOPY varchar2 )
1020 IS
1021 l_OBJECT_id NUMBER;
1022 l_OBJECT_type VARCHAR2(30);
1023 l_orig_status_id NUMBER;
1024 l_return_status varchar2(1);
1025 l_msg_count NUMBER;
1026 l_msg_data VARCHAR2(4000);
1027 l_error_msg VARCHAR2(4000);
1028 l_version NUMBER;
1029 l_approval_type VARCHAR2(30);
1030 BEGIN
1031 FND_MSG_PUB.initialize();
1032 --
1033 -- RUN mode
1034 --
1035 IF (funcmode = 'RUN') THEN
1036 -- get the object id
1037 l_OBJECT_id := wf_engine.GetItemAttrNumber(
1038 itemtype => itemtype,
1039 itemkey => itemkey,
1040 aname => 'AMW_OBJECT_ID' );
1041 -- get the OBJECT type
1042 l_OBJECT_type := wf_engine.GetItemAttrText(
1043 itemtype => itemtype,
1044 itemkey => itemkey,
1045 aname => 'AMW_OBJECT_TYPE' );
1046
1047 l_version := wf_engine.GetItemAttrNumber(
1048 itemtype => itemtype,
1049 itemkey => itemkey,
1050 aname => 'AMW_OBJECT_VERSION_NUMBER' );
1051
1052 l_approval_type := wf_engine.GetItemAttrText(
1053 itemtype => itemtype,
1054 itemkey => itemkey,
1055 aname => 'AMW_APPROVAL_TYPE' );
1056
1057 /*
1058 l_orig_status_id := wf_engine.GetItemAttrNumber(
1059 itemtype => itemtype,
1060 itemkey => itemkey,
1061 aname => 'AMW_ORIG_STAT_ID' );
1062 */
1063
1064 Wf_Engine.SetItemAttrText(itemtype => itemtype,
1065 itemkey => itemkey,
1066 aname => 'UPDATE_GEN_STATUS',
1067 avalue => 'ERROR');
1068
1069 Update_Status(itemtype => itemtype,
1070 itemkey => itemkey,
1071 actid => actid,
1072 funcmode => funcmode,
1073 resultout => resultout);
1074
1075 IF resultout = 'COMPLETE:ERROR' then
1076
1077 FND_MSG_PUB.Count_And_Get (
1078 p_encoded => FND_API.G_FALSE,
1079 p_count => l_msg_count,
1080 p_data => l_msg_data
1081 );
1082 Handle_Err
1083 (p_itemtype => itemtype ,
1084 p_itemkey => itemkey ,
1085 p_msg_count => l_msg_count, -- Number of error Messages
1086 p_msg_data => l_msg_data ,
1087 p_attr_name => 'AMW_ERROR_MSG',
1088 x_error_msg => l_error_msg
1089 );
1090 END IF;
1091
1092 resultout := 'COMPLETE:';
1093 END IF;
1094
1095 --
1096 -- CANCEL mode
1097 --
1098 IF (funcmode = 'CANCEL') THEN
1099 resultout := 'COMPLETE:';
1100 return;
1101 END IF;
1102
1103 --
1104 -- TIMEOUT mode
1105 --
1106 IF (funcmode = 'TIMEOUT') THEN
1107 resultout := 'COMPLETE:';
1108 return;
1109 END IF;
1110 --
1111
1112 EXCEPTION
1113 WHEN FND_API.G_EXC_ERROR THEN
1114 FND_MSG_PUB.Count_And_Get (
1115 p_encoded => FND_API.G_FALSE,
1116 p_count => l_msg_count,
1117 p_data => l_msg_data
1118 );
1119 Handle_Err
1120 (p_itemtype => itemtype ,
1121 p_itemkey => itemkey ,
1122 p_msg_count => l_msg_count, -- Number of error Messages
1123 p_msg_data => l_msg_data ,
1124 p_attr_name => 'AMW_ERROR_MSG',
1125 x_error_msg => l_error_msg
1126 );
1127 wf_core.context('amw_gen_approval_pvt',
1128 'Revert_Status',
1129 itemtype, itemkey,to_char(actid),l_error_msg);
1130 resultout := 'COMPLETE:ERROR';
1131 --RAISE;
1132 WHEN OTHERS THEN
1133 FND_MSG_PUB.Count_And_Get (
1134 p_encoded => FND_API.G_FALSE,
1135 p_count => l_msg_count,
1139 (p_itemtype => itemtype ,
1136 p_data => l_msg_data
1137 );
1138 Handle_Err
1140 p_itemkey => itemkey ,
1141 p_msg_count => l_msg_count, -- Number of error Messages
1142 p_msg_data => l_msg_data ,
1143 p_attr_name => 'AMW_ERROR_MSG',
1144 x_error_msg => l_error_msg
1145 ) ;
1146 wf_core.context('amw_gen_approval_pvt',
1147 'Revert_status',
1148 itemtype, itemkey,to_char(actid),l_error_msg);
1149 RAISE;
1150 END Revert_Status;
1151
1152 /*****************************************************************
1153 -- Start of Comments
1154 --
1155 -- NAME
1156 -- AbortProcess
1157 -- PURPOSE
1158 -- This Procedure will abort the process of Approvals
1159 -- Used By Activities
1160 --
1161 -- NOTES
1162 -- HISTORY
1163 -- End of Comments
1164 *****************************************************************/
1165
1166 PROCEDURE AbortProcess
1167 (p_itemkey IN VARCHAR2
1168 ,p_workflow_process IN VARCHAR2 DEFAULT NULL
1169 ,p_itemtype IN VARCHAR2 DEFAULT NULL
1170 )
1171 IS
1172 itemkey VARCHAR2(30) := p_itemkey ;
1173 itemtype VARCHAR2(30) := nvl(p_itemtype,'AMW_APPROVAL') ;
1174 BEGIN
1175 AMW_Utility_PVT.debug_message('Process Abort Process');
1176 WF_ENGINE.AbortProcess (itemtype => itemtype,
1177 itemkey => itemkey ,
1178 process => p_workflow_process);
1179 EXCEPTION
1180 WHEN OTHERS THEN
1181 wf_core.context('amw_gen_approval_pvt',
1182 'AbortProcess',
1183 itemtype,
1184 itemkey
1185 ,p_workflow_process);
1186 RAISE;
1187 END AbortProcess;
1188
1189
1190 --------------------------------------------------------------------------------
1191 --
1192 -- Procedure
1193 -- Get_Api_Name
1194 --
1195 ---------------------------------------------------------------------------------
1196 PROCEDURE Get_Api_Name( p_rule_used_by in varchar2,
1197 p_rule_used_by_type in varchar2,
1198 p_rule_type in VARCHAR2,
1199 p_appr_type in VARCHAR2,
1200 x_pkg_name OUT NOCOPY varchar2,
1201 x_proc_name OUT NOCOPY varchar2,
1202 x_return_stat OUT NOCOPY varchar2)
1203 IS
1204 CURSOR c_API_Name(rule_used_by_in IN VARCHAR2,
1205 rule_used_by_type_in IN VARCHAR2,
1206 rule_type_in IN VARCHAR2,
1207 appr_type_in IN VARCHAR2) is
1208 SELECT package_name, procedure_name
1209 FROM amw_OBJECT_rules
1210 WHERE rule_used_by = rule_used_by_in
1211 AND object_type = rule_used_by_type_in
1212 AND rule_type = rule_type_in
1213 AND nvl(APPROVAL_TYPE, 'N') = nvl(appr_type_in, 'N');
1214
1215 BEGIN
1216 x_return_stat := 'S';
1217 open c_API_Name(p_rule_used_by, p_rule_used_by_type,p_rule_type,p_appr_type);
1218 fetch c_API_Name into x_pkg_name, x_proc_name;
1219 IF c_API_Name%NOTFOUND THEN
1220 x_return_stat := 'E';
1221 END IF;
1222 close c_API_Name;
1223 EXCEPTION
1224 -- This exception will never be raised
1225 --WHEN NO_DATA_FOUND THEN
1226 -- x_return_stat := 'E';
1227 WHEN OTHERS THEN
1228 x_return_stat := 'U';
1229 RAISE;
1230 END Get_Api_Name;
1231
1232
1233 --------------------------------------------------------------------------------
1234 --
1235 -- Procedure
1236 -- Ntf_Approval(document_id in varchar2,
1237 -- display_type in varchar2,
1238 -- document in out varchar2,
1239 -- document_type in out varchar2 )
1240 ---------------------------------------------------------------------------------
1241 PROCEDURE Ntf_Approval(document_id in varchar2,
1242 display_type in varchar2,
1243 document in OUT NOCOPY varchar2,
1244 document_type in OUT NOCOPY varchar2 )
1245 IS
1246 l_pkg_name varchar2(80);
1247 l_proc_name varchar2(80);
1248 l_return_stat varchar2(1);
1249 l_OBJECT_type varchar2(80);
1250 l_approval_type varchar2(80);
1251 l_msg_data VARCHAR2(4000);
1252 l_msg_count number;
1253 l_error_msg VARCHAR2(4000);
1254 dml_str varchar2(2000);
1255 l_itemType varchar2(80);
1256 l_itemKey varchar2(80);
1257 BEGIN
1258 l_itemType := nvl(substr(document_id, 1,instr(document_id,':')-1),'AMWGAPP');
1259 l_itemKey := substr(document_id, instr(document_id,':')+1);
1260
1261 l_OBJECT_type := wf_engine.GetItemAttrText(
1262 itemtype => l_itemtype,
1263 itemkey => l_itemkey,
1264 aname => 'AMW_OBJECT_TYPE' );
1265
1266 l_approval_type := wf_engine.GetItemAttrText(
1267 itemtype => l_itemtype,
1271 Get_Api_Name('WORKFLOW',
1268 itemkey => l_itemkey,
1269 aname => 'AMW_APPROVAL_TYPE' );
1270
1272 l_OBJECT_type,
1273 'NTF_APPROVAL',
1274 l_approval_type,
1275 l_pkg_name,
1276 l_proc_name,
1277 l_return_stat);
1278
1279 if (l_return_stat = 'S') then
1280 dml_str := 'BEGIN ' || l_pkg_name||'.'||l_proc_name||'(:document_id,:display_type,:document,:document_type); END;';
1281 EXECUTE IMMEDIATE dml_str USING IN document_id,IN display_type,IN OUT document, IN OUT document_type;
1282 end if;
1283 /*
1284 EXCEPTION
1285 WHEN OTHERS THEN
1286 FND_MSG_PUB.Count_And_Get (
1287 p_encoded => FND_API.G_FALSE,
1288 p_count => l_msg_count,
1289 p_data => l_msg_data
1290 );
1291 Handle_Err
1292 (p_itemtype => itemtype ,
1293 p_itemkey => itemkey ,
1294 p_msg_count => l_msg_count, -- Number of error Messages
1295 p_msg_data => l_msg_data ,
1296 p_attr_name => 'AMW_ERROR_MSG',
1297 x_error_msg => l_error_msg
1298 ) ;
1299 wf_core.context('amw_gen_approval_pvt',
1300 'Reject_OBJECT_status',
1301 itemtype, itemkey,to_char(actid),l_error_msg);
1302 RAISE;
1303 */
1304 END Ntf_Approval;
1305
1306 --------------------------------------------------------------------------------
1307 --
1308 -- Procedure
1309 -- Ntf_Approval_reminder(itemtype in varchar2,
1310 -- itemkey in varchar2,
1311 -- p_OBJECT_type in varchar2,
1312 -- actid in number,
1313 -- funcmode in varchar2,
1314 -- resultout out varchar2 )
1315 ---------------------------------------------------------------------------------
1316 PROCEDURE Ntf_Approval_reminder(document_id in varchar2,
1317 display_type in varchar2,
1318 document in OUT NOCOPY varchar2,
1319 document_type in OUT NOCOPY varchar2 )
1320 IS
1321 l_pkg_name varchar2(80);
1322 l_proc_name varchar2(80);
1323 l_return_stat varchar2(1);
1324 l_OBJECT_type varchar2(80);
1325 l_approval_type varchar2(80);
1326 l_msg_data VARCHAR2(4000);
1327 l_msg_count number;
1328 l_error_msg VARCHAR2(4000);
1329 dml_str varchar2(2000);
1330 l_itemType varchar2(80);
1331 l_itemKey varchar2(80);
1332 BEGIN
1333 l_itemType := nvl(substr(document_id, 1,instr(document_id,':')-1),'AMWGAPP');
1334 l_itemKey := substr(document_id, instr(document_id,':')+1);
1335
1336 l_OBJECT_type := wf_engine.GetItemAttrText(
1337 itemtype => l_itemtype,
1338 itemkey => l_itemkey,
1339 aname => 'AMW_OBJECT_TYPE' );
1340
1341 l_approval_type := wf_engine.GetItemAttrText(
1342 itemtype => l_itemtype,
1343 itemkey => l_itemkey,
1344 aname => 'AMW_APPROVAL_TYPE' );
1345
1346 Get_Api_Name('WORKFLOW',
1347 l_OBJECT_type,
1348 'NTF_APPROVAL_REMINDER',
1349 l_approval_type,
1350 l_pkg_name,
1351 l_proc_name,
1352 l_return_stat);
1353 if (l_return_stat = 'S') then
1357 /*
1354 dml_str := 'BEGIN ' || l_pkg_name||'.'||l_proc_name||'(:document_id,:display_type,:document,:document_type); END;';
1355 EXECUTE IMMEDIATE dml_str USING IN document_id,IN display_type,IN OUT document,IN OUT document_type;
1356 end if;
1358 EXCEPTION
1359 WHEN OTHERS THEN
1360 FND_MSG_PUB.Count_And_Get (
1361 p_encoded => FND_API.G_FALSE,
1362 p_count => l_msg_count,
1363 p_data => l_msg_data
1364 );
1365 Handle_Err
1366 (p_itemtype => itemtype ,
1367 p_itemkey => itemkey ,
1368 p_msg_count => l_msg_count, -- Number of error Messages
1369 p_msg_data => l_msg_data ,
1370 p_attr_name => 'AMW_ERROR_MSG',
1371 x_error_msg => l_error_msg
1372 ) ;
1373 wf_core.context('amw_gen_approval_pvt',
1374 'Ntf_Approval_reminder',
1375 itemtype, itemkey,to_char(actid),l_error_msg);
1376 RAISE;
1377 */
1378
1379 END Ntf_Approval_reminder;
1380
1381 --------------------------------------------------------------------------------
1382 --
1383 -- Procedure
1384 -- Ntf_Forward_FYI(itemtype in varchar2,
1385 -- itemkey in varchar2,
1386 -- p_OBJECT_type in varchar2,
1387 -- actid in number,
1388 -- funcmode in varchar2,
1389 -- resultout out varchar2 )
1390 ---------------------------------------------------------------------------------
1391 PROCEDURE Ntf_Forward_FYI(document_id in varchar2,
1392 display_type in varchar2,
1393 document in OUT NOCOPY varchar2,
1394 document_type in OUT NOCOPY varchar2 )
1395 IS
1396 l_pkg_name varchar2(80);
1397 l_proc_name varchar2(80);
1398 l_return_stat varchar2(1);
1399 l_OBJECT_type varchar2(80);
1400 l_approval_type varchar2(80);
1401 l_msg_data VARCHAR2(4000);
1402 l_msg_count number;
1403 l_error_msg VARCHAR2(4000);
1404 dml_str varchar2(2000);
1405 l_itemType varchar2(80);
1406 l_itemKey varchar2(80);
1407 BEGIN
1408 l_itemType := nvl(substr(document_id, 1,instr(document_id,':')-1),'AMWGAPP');
1409 l_itemKey := substr(document_id, instr(document_id,':')+1);
1410
1411 l_OBJECT_type := wf_engine.GetItemAttrText(
1412 itemtype => l_itemtype,
1413 itemkey => l_itemkey,
1414 aname => 'AMW_OBJECT_TYPE' );
1415
1416 l_approval_type := wf_engine.GetItemAttrText(
1417 itemtype => l_itemtype,
1418 itemkey => l_itemkey,
1419 aname => 'AMW_APPROVAL_TYPE' );
1420
1421 Get_Api_Name('WORKFLOW',
1422 l_OBJECT_type,
1423 'NTF_FORWARD_FYI',
1424 l_approval_type,
1425 l_pkg_name,
1426 l_proc_name,
1427 l_return_stat);
1428 if (l_return_stat = 'S') then
1429 dml_str := 'BEGIN '|| l_pkg_name||'.'||l_proc_name||'(:document_id,:display_type,:document,:document_type); END;';
1430 EXECUTE IMMEDIATE dml_str USING IN document_id,IN display_type,IN OUT document,IN OUT document_type;
1431 end if;
1432
1433 /*
1434 EXCEPTION
1435 WHEN OTHERS THEN
1436 FND_MSG_PUB.Count_And_Get (
1437 p_encoded => FND_API.G_FALSE,
1438 p_count => l_msg_count,
1439 p_data => l_msg_data
1440 );
1441 Handle_Err
1442 (p_itemtype => itemtype ,
1443 p_itemkey => itemkey ,
1444 p_msg_count => l_msg_count, -- Number of error Messages
1445 p_msg_data => l_msg_data ,
1446 p_attr_name => 'AMW_ERROR_MSG',
1447 x_error_msg => l_error_msg
1448 ) ;
1449 wf_core.context('amw_gen_approval_pvt',
1450 'Ntf_Forward_FYI',
1451 itemtype, itemkey,to_char(actid),l_error_msg);
1452 RAISE;
1453 */
1454
1455 END Ntf_Forward_FYI;
1456
1457 --------------------------------------------------------------------------------
1458 --
1459 -- Procedure
1460 -- Ntf_Approved_FYI(itemtype in varchar2,
1461 -- itemkey in varchar2,
1462 -- actid in number,
1463 -- funcmode in varchar2,
1464 -- resultout out varchar2 )
1465 ---------------------------------------------------------------------------------
1466 PROCEDURE Ntf_Approved_FYI(document_id in varchar2,
1467 display_type in varchar2,
1468 document in OUT NOCOPY varchar2,
1469 document_type in OUT NOCOPY varchar2 )
1470 IS
1471 l_pkg_name varchar2(80);
1472 l_proc_name varchar2(80);
1473 l_return_stat varchar2(1);
1474 l_OBJECT_type varchar2(80);
1475 l_approval_type varchar2(80);
1476 l_msg_data VARCHAR2(4000);
1477 l_msg_count number;
1478 l_error_msg VARCHAR2(4000);
1482 BEGIN
1479 dml_str varchar2(2000);
1480 l_itemType varchar2(80);
1481 l_itemKey varchar2(80);
1483 l_itemType := nvl(substr(document_id, 1,instr(document_id,':')-1),'AMWGAPP');
1484 l_itemKey := substr(document_id, instr(document_id,':')+1);
1485
1486 l_OBJECT_type := wf_engine.GetItemAttrText(
1487 itemtype => l_itemtype,
1488 itemkey => l_itemkey,
1489 aname => 'AMW_OBJECT_TYPE' );
1490
1491 l_approval_type := wf_engine.GetItemAttrText(
1492 itemtype => l_itemtype,
1493 itemkey => l_itemkey,
1494 aname => 'AMW_APPROVAL_TYPE' );
1495
1496 Get_Api_Name('WORKFLOW',
1497 l_OBJECT_type,
1498 'NTF_APPROVED_FYI',
1499 l_approval_type,
1500 l_pkg_name,
1501 l_proc_name,
1502 l_return_stat);
1503 if (l_return_stat = 'S') then
1504 dml_str := 'BEGIN ' || l_pkg_name||'.'||l_proc_name||'(:document_id,:display_type,:document,:document_type); END;';
1505 EXECUTE IMMEDIATE dml_str USING IN document_id,IN display_type,IN OUT document,IN OUT document_type;
1506 end if;
1507
1508 /*
1509 EXCEPTION
1510 WHEN OTHERS THEN
1511 FND_MSG_PUB.Count_And_Get (
1512 p_encoded => FND_API.G_FALSE,
1513 p_count => l_msg_count,
1514 p_data => l_msg_data
1515 );
1516 Handle_Err
1517 (p_itemtype => itemtype ,
1518 p_itemkey => itemkey ,
1519 p_msg_count => l_msg_count, -- Number of error Messages
1520 p_msg_data => l_msg_data ,
1521 p_attr_name => 'AMW_ERROR_MSG',
1522 x_error_msg => l_error_msg
1523 ) ;
1524 wf_core.context('amw_gen_approval_pvt',
1525 'Ntf_Approved_FYI',
1526 itemtype, itemkey,to_char(actid),l_error_msg);
1527 RAISE;
1528 */
1529 END Ntf_Approved_FYI;
1530
1531 -------------------------------------------------------------------------------
1532 --
1533 -- Procedure
1534 -- Ntf_Rejected_FYI(itemtype in varchar2,
1535 -- itemkey in varchar2,
1536 -- actid in number,
1537 -- funcmode in varchar2,
1538 -- resultout out varchar2 )
1539 ---------------------------------------------------------------------------------
1540 PROCEDURE Ntf_Rejected_FYI(document_id in varchar2,
1541 display_type in varchar2,
1542 document in OUT NOCOPY varchar2,
1543 document_type in OUT NOCOPY varchar2 )
1544 IS
1545 l_pkg_name varchar2(80);
1546 l_proc_name varchar2(80);
1547 l_return_stat varchar2(1);
1548 l_OBJECT_type varchar2(80);
1549 l_approval_type varchar2(80);
1550 l_msg_data VARCHAR2(4000);
1551 l_msg_count number;
1552 l_error_msg VARCHAR2(4000);
1553 dml_str varchar2(2000);
1554 l_itemType varchar2(80);
1555 l_itemKey varchar2(80);
1556 BEGIN
1557 l_itemType := nvl(substr(document_id, 1,instr(document_id,':')-1),'AMWGAPP');
1558 l_itemKey := substr(document_id, instr(document_id,':')+1);
1559
1560 l_OBJECT_type := wf_engine.GetItemAttrText(
1561 itemtype => l_itemtype,
1562 itemkey => l_itemkey,
1563 aname => 'AMW_OBJECT_TYPE' );
1564
1565 l_approval_type := wf_engine.GetItemAttrText(
1566 itemtype => l_itemtype,
1567 itemkey => l_itemkey,
1568 aname => 'AMW_APPROVAL_TYPE' );
1569
1570 Get_Api_Name('WORKFLOW',
1571 l_OBJECT_type,
1572 'NTF_REJECTED_FYI',
1573 l_approval_type,
1574 l_pkg_name,
1578 if (l_return_stat = 'S') then
1575 l_proc_name,
1576 l_return_stat);
1577
1579 dml_str := 'BEGIN '|| l_pkg_name||'.'||l_proc_name||'(:document_id,:display_type,:document,:document_type); END;';
1580 EXECUTE IMMEDIATE dml_str USING IN document_id,IN display_type,IN OUT document,IN OUT document_type;
1581 end if;
1582
1583 /*
1584 EXCEPTION
1585 WHEN OTHERS THEN
1586 FND_MSG_PUB.Count_And_Get (
1587 p_encoded => FND_API.G_FALSE,
1588 p_count => l_msg_count,
1589 p_data => l_msg_data
1590 );
1591 Handle_Err
1592 (p_itemtype => itemtype ,
1593 p_itemkey => itemkey ,
1594 p_msg_count => l_msg_count, -- Number of error Messages
1595 p_msg_data => l_msg_data ,
1596 p_attr_name => 'AMW_ERROR_MSG',
1597 x_error_msg => l_error_msg
1598 ) ;
1599 wf_core.context('amw_gen_approval_pvt',
1600 'Ntf_Rejected_FYI',
1601 itemtype, itemkey,to_char(actid),l_error_msg);
1602 RAISE;
1603 */
1604
1605 END Ntf_Rejected_FYI;
1606 -------------------------------------------------------------------------------
1607 --
1608 -- Procedure
1609 -- Ntf_Requestor_Of_Error (itemtype in varchar2,
1610 -- itemkey in varchar2,
1611 -- actid in number,
1612 -- funcmode in varchar2,
1613 -- resultout out varchar2 )
1614 -- If uptaking functionality has an API registered for handling error, that API is
1615 -- used to generate the error message content. If not, this API generates a less
1616 -- meaningful message which will notify the requestor of an error
1617 ---------------------------------------------------------------------------------
1618 PROCEDURE Ntf_Requestor_Of_Error(document_id in varchar2,
1619 display_type in varchar2,
1620 document in OUT NOCOPY varchar2,
1621 document_type in OUT NOCOPY varchar2 )
1622 IS
1623 l_pkg_name varchar2(80);
1624 l_proc_name varchar2(80);
1625 l_return_stat varchar2(1);
1626 l_OBJECT_type varchar2(80);
1627 l_approval_type varchar2(80);
1628 l_msg_data VARCHAR2(10000);
1629 l_msg_count number;
1630 l_error_msg VARCHAR2(4000);
1631 dml_str varchar2(2000);
1632 l_appr_meaning varchar2(240);
1633 l_appr_obj_name varchar2(240);
1634 l_itemType varchar2(80);
1635 l_itemKey varchar2(80);
1636 l_body_string varchar2(2500);
1637 l_errmsg varchar2(4000);
1638 BEGIN
1639 l_itemType := nvl(substr(document_id, 1,instr(document_id,':')-1),'AMWGAPP');
1640 l_itemKey := substr(document_id, instr(document_id,':')+1);
1641
1642 l_OBJECT_type := wf_engine.GetItemAttrText(
1643 itemtype => l_itemtype,
1644 itemkey => l_itemkey,
1645 aname => 'AMW_OBJECT_TYPE' );
1646
1647 l_approval_type := wf_engine.GetItemAttrText(
1648 itemtype => l_itemtype,
1649 itemkey => l_itemkey,
1650 aname => 'AMW_APPROVAL_TYPE' );
1651
1652 l_appr_meaning := wf_engine.GetItemAttrText(
1653 itemtype => l_itemtype,
1654 itemkey => l_itemkey,
1655 aname => 'AMW_APPROVAL_OBJECT_MEANING');
1656
1657 l_appr_obj_name := wf_engine.GetItemAttrText(
1658 itemtype => l_itemtype,
1659 itemkey => l_itemkey,
1660 aname => 'AMW_APPROVAL_OBJECT_NAME');
1661
1662
1663 Get_Api_Name('WORKFLOW',
1664 l_OBJECT_type,
1665 'NTF_ERROR',
1666 l_approval_type,
1667 l_pkg_name,
1668 l_proc_name,
1669 l_return_stat);
1670 if (l_return_stat = 'S') then
1671 dml_str := 'BEGIN ' || l_pkg_name||'.'||l_proc_name||'(:document_id,:display_type,:document,:document_type); END;';
1672 EXECUTE IMMEDIATE dml_str USING IN document_id,IN display_type,IN OUT document, IN OUT document_type;
1673
1674 elsif (l_return_stat = 'E') THEN -- no data found, generate a generic message
1675
1676 l_errmsg := wf_engine.GetItemAttrText(
1677 itemtype => l_itemtype,
1678 itemkey => l_itemkey,
1679 aname => 'AMW_ERROR_MSG');
1680 fnd_message.set_name ('AMW', 'AMW_GEN_NTF_ERROR_BODY');
1681 fnd_message.set_token ('OBJ_MEANING', l_appr_meaning, FALSE);
1682 fnd_message.set_token ('OBJ_NAME', l_appr_obj_name, FALSE);
1683 fnd_message.set_token ('ERR_MSG', l_errmsg, FALSE);
1684 l_body_string := SUBSTR(fnd_message.get,1,10000);
1685
1686 document_type := 'text/plain';
1687 document := l_body_string;
1688 end if;
1689
1690 END Ntf_Requestor_Of_Error;
1691 -------------------------------------------------------------------------------
1692 -- Start of Comments
1693 --
1694 -- NAME
1695 -- Update_Status
1696 --
1697 -- PARAMETERS
1698 -- itemtype (varchar2)
1699 -- itemkey (varchar2)
1700 -- actid (number)
1701 -- funcmode (number)
1702 -- reultout (varchar2)
1703 -- PURPOSE
1704 -- This is a generic procedure that is called by various procedures.
1705 -- Depending on the Object Type and the Rule Type (UPDATE) the packaged procedure
1706 -- to execute is obtained by calling Get_API_Name().
1707 -- NOTES
1708 -- HISTORY
1709 -- 6/4/2003 MUMU PANDE CREATION
1710 -- 6/17/2003 KARTHI MUTHUSWAMY Added comments
1711 -- End of Comments
1712 -------------------------------------------------------------------------------
1713 PROCEDURE Update_Status(itemtype IN varchar2,
1714 itemkey IN varchar2,
1715 actid in number,
1716 funcmode in varchar2,
1717 resultout OUT NOCOPY varchar2 )
1718 IS
1719 l_pkg_name varchar2(80);
1720 l_proc_name varchar2(80);
1721 l_return_stat varchar2(1);
1722 l_msg_data VARCHAR2(4000);
1723 l_msg_count number;
1724 l_error_msg VARCHAR2(4000);
1725 dml_str varchar2(2000);
1726 l_OBJECT_type varchar2(80);
1727 l_approval_type varchar2(80);
1728
1729
1730 BEGIN
1731 l_OBJECT_type := wf_engine.GetItemAttrText(
1732 itemtype => itemtype,
1733 itemkey => itemkey,
1734 aname => 'AMW_OBJECT_TYPE' );
1735
1736 l_approval_type := wf_engine.GetItemAttrText(
1737 itemtype => itemtype,
1738 itemkey => itemkey,
1739 aname => 'AMW_APPROVAL_TYPE' );
1740
1741 -- Obtain the Package.Procedure for the Object type and Approval Type
1742 Get_Api_Name('WORKFLOW',
1743 l_OBJECT_type,
1744 'UPDATE',
1745 l_approval_type,
1746 l_pkg_name,
1747 l_proc_name,
1748 l_return_stat);
1749
1750 if (l_return_stat = 'S') then
1751 dml_str := 'BEGIN ' || l_pkg_name||'.'||l_proc_name||'(:itemtype,:itemkey,:actid,:funcmode,:resultout); END;';
1752 EXECUTE IMMEDIATE dml_str USING IN itemtype,IN itemkey, IN actid,IN funcmode,OUT resultout;
1753 end if;
1754 END Update_Status;
1755
1756 -------------------------------------------------------------------------------
1757 -- Start of Comments
1758 --
1759 -- NAME
1760 -- Approved_Update_Status
1761 --
1762 -- PARAMETERS
1763 -- itemtype (varchar2)
1764 -- itemkey (varchar2)
1765 -- actid (number)
1766 -- funcmode (number)
1767 -- reultout (varchar2)
1768 -- PURPOSE
1769 -- This procedure is called from the "Update Status for Approval" function activity.
1770 -- It sets the 'UPDATE_GEN_STATUS' item attribute to "APPROVED" and calls
1771 -- Update_Status().
1772 -- NOTES
1773 -- HISTORY
1774 -- 6/4/2003 MUMU PANDE CREATION
1775 -- 6/17/2003 KARTHI MUTHUSWAMY Added comments
1776 -- End of Comments
1777 -------------------------------------------------------------------------------
1778 PROCEDURE Approved_Update_Status(itemtype IN varchar2,
1779 itemkey IN varchar2,
1780 actid in number,
1781 funcmode in varchar2,
1782 resultout OUT NOCOPY varchar2 )
1783 IS
1784 BEGIN
1785 -- The Object is Approved. Set the item attribute UPDATE_GEN_STATUS to 'APPROVED'
1786 WF_ENGINE.SetItemAttrText(itemtype => itemtype ,
1787 itemkey => itemkey,
1788 aname => 'UPDATE_GEN_STATUS',
1789 avalue => 'APPROVED' );
1790
1791 -- Call Update_Status() to update the status of the object to Approved
1792 Update_Status(itemtype => itemtype,
1796 resultout => resultout);
1793 itemkey => itemkey,
1794 actid => actid,
1795 funcmode => funcmode,
1797
1798 END Approved_Update_Status;
1799
1800 -------------------------------------------------------------------------------
1801 -- Start of Comments
1802 --
1803 -- NAME
1804 -- Reject_Update_Status
1805 --
1806 -- PARAMETERS
1807 -- itemtype (varchar2)
1808 -- itemkey (varchar2)
1809 -- actid (number)
1810 -- funcmode (number)
1811 -- reultout (varchar2)
1812 -- PURPOSE
1813 -- This procedure is called from the "Update Status for Rejection" function activity.
1814 -- It sets the 'UPDATE_GEN_STATUS' item attribute to "REJECTED" and calls
1815 -- Update_Status().
1816 -- NOTES
1817 -- HISTORY
1818 -- 6/4/2003 MUMU PANDE CREATION
1819 -- 6/17/2003 KARTHI MUTHUSWAMY Added comments
1820 -- End of Comments
1821 -------------------------------------------------------------------------------
1822 PROCEDURE Reject_Update_Status(itemtype IN varchar2,
1823 itemkey IN varchar2,
1824 actid in number,
1825 funcmode in varchar2,
1826 resultout OUT NOCOPY varchar2 )
1827 IS
1828
1829 l_OBJECT_id NUMBER;
1830 l_OBJECT_type VARCHAR2(30);
1831 l_approver_seq NUMBER;
1832 l_version NUMBER;
1833 l_approver_id NUMBER;
1834 l_approval_detail_id NUMBER;
1835 l_approval_type VARCHAR2(30);
1836 l_return_status VARCHAR2(1);
1837 l_msg_count NUMBER;
1838 l_msg_data VARCHAR2(4000);
1839 l_error_msg VARCHAR2(4000);
1840 l_note VARCHAR2(4000);
1841 BEGIN
1842 -- The Object is Rejected. Set the item attribute UPDATE_GEN_STATUS to 'REJECTED'
1843 WF_ENGINE.SetItemAttrText(itemtype => itemtype ,
1844 itemkey => itemkey,
1845 aname => 'UPDATE_GEN_STATUS',
1846 avalue => 'REJECTED');
1847
1848 l_OBJECT_id := Wf_Engine.GetItemAttrNumber(
1849 itemtype => itemtype,
1850 itemkey => itemkey,
1851 aname => 'AMW_OBJECT_ID' );
1852
1853
1854 l_OBJECT_type := Wf_Engine.GetItemAttrText(
1855 itemtype => itemtype,
1856 itemkey => itemkey,
1857 aname => 'AMW_OBJECT_TYPE' );
1858
1859 l_approver_seq := Wf_Engine.GetItemAttrNumber(
1860 itemtype => itemtype,
1861 itemkey => itemkey,
1862 aname => 'AMW_APPROVER_SEQ' );
1863
1864 l_version := Wf_Engine.GetItemAttrNumber(
1865 itemtype => itemtype,
1866 itemkey => itemkey,
1867 aname => 'AMW_OBJECT_VERSION_NUMBER' );
1868
1869 l_approver_id := Wf_Engine.GetItemAttrNumber(
1870 itemtype => itemtype,
1871 itemkey => itemkey,
1872 aname => 'AMW_APPROVER_ID' );
1873
1874 l_approval_detail_id := Wf_Engine.GetItemAttrNumber(
1875 itemtype => itemtype,
1876 itemkey => itemkey,
1877 aname => 'AMW_APPROVAL_DETAIL_ID' );
1878
1879 l_approval_type := Wf_Engine.GetItemAttrText(
1880 itemtype => itemtype,
1881 itemkey => itemkey,
1882 aname => 'AMW_APPROVAL_TYPE' );
1883
1884 l_note := Wf_Engine.GetItemAttrText(
1885 itemtype => itemtype,
1886 itemkey => itemkey,
1887 aname => 'APPROVAL_NOTE' );
1888 -- This needs to be last as it would change version number
1889 Update_Status(itemtype => itemtype,
1890 itemkey => itemkey,
1891 actid => actid,
1892 funcmode => funcmode,
1893 resultout => resultout);
1894
1895 EXCEPTION
1896 WHEN FND_API.G_EXC_ERROR THEN
1897 FND_MSG_PUB.Count_And_Get (
1898 p_encoded => FND_API.G_FALSE,
1899 p_count => l_msg_count,
1900 p_data => l_msg_data
1901 );
1902 Handle_Err
1903 (p_itemtype => itemtype ,
1904 p_itemkey => itemkey ,
1905 p_msg_count => l_msg_count, -- Number of error Messages
1906 p_msg_data => l_msg_data ,
1907 p_attr_name => 'AMW_ERROR_MSG',
1908 x_error_msg => l_error_msg
1909 );
1910 wf_core.context('amw_gen_approval_pvt',
1911 'set_approval_rules',
1912 itemtype, itemkey,to_char(actid),l_error_msg);
1913 resultout := 'COMPLETE:ERROR';
1914 --RAISE;
1915 WHEN OTHERS THEN
1916 FND_MSG_PUB.Count_And_Get (
1917 p_encoded => FND_API.G_FALSE,
1918 p_count => l_msg_count,
1919 p_data => l_msg_data
1920 );
1921 Handle_Err
1922 (p_itemtype => itemtype ,
1923 p_itemkey => itemkey ,
1924 p_msg_count => l_msg_count, -- Number of error Messages
1925 p_msg_data => l_msg_data ,
1926 p_attr_name => 'AMW_ERROR_MSG',
1927 x_error_msg => l_error_msg
1928 ) ;
1929 wf_core.context('amw_gen_approval_pvt',
1930 'set_approver_details',
1934 END Reject_Update_Status;
1931 itemtype, itemkey,to_char(actid),l_error_msg);
1932 RAISE;
1933 --
1935
1936 /*****************************************************************
1937 -- Start of Comments
1938 -- NAME
1939 -- Approval_Required
1940 -- PURPOSE
1941 -- This Procedure will determine if the requestor of an OBJECT
1942 -- is the same as the approver for that OBJECT. This is used to
1943 -- bypass approvals if requestor is the same as the approver.
1944 -- Used By Activities
1945 -- NOTES
1946 -- HISTORY
1947 -- End of Comments
1948 ****************************************************************/
1949 PROCEDURE Approval_Required(itemtype IN VARCHAR2,
1950 itemkey IN VARCHAR2,
1951 actid IN NUMBER,
1952 funcmode IN VARCHAR2,
1953 resultout OUT NOCOPY VARCHAR2)
1954 IS
1955 --
1956 l_requestor NUMBER;
1957 l_approver NUMBER;
1958
1959
1960 BEGIN
1961 Fnd_Msg_Pub.initialize();
1962 --
1963 -- RUN mode
1964 --
1965 IF (funcmode = 'RUN') THEN
1966 -- Get the Requestor
1967 l_requestor := Wf_Engine.GetItemAttrNumber(itemtype => itemtype,
1968 itemkey => itemkey,
1969 aname => 'AMW_REQUESTOR_ID');
1970 -- Get the Approver
1971 l_approver := Wf_Engine.GetItemAttrNumber(itemtype => itemtype,
1972 itemkey => itemkey,
1973 aname => 'AMW_APPROVER_ID');
1974 IF l_requestor = l_approver THEN
1975 resultout := 'COMPLETE:N';
1976 ELSE
1977 resultout := 'COMPLETE:Y';
1978 END IF;
1979 RETURN;
1980 END IF;
1981
1982 IF (funcmode = 'CANCEL') THEN
1983 resultout := 'COMPLETE:';
1984 RETURN;
1985 END IF;
1986
1987 --
1988 -- TIMEOUT mode
1989 --
1990 IF (funcmode = 'TIMEOUT') THEN
1991 resultout := 'COMPLETE:';
1992 RETURN;
1993 END IF;
1994 END Approval_Required;
1995
1996 END amw_gen_approval_pvt;