DBA Data[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;