DBA Data[Home] [Help]

PACKAGE BODY: APPS.PV_AME_API_W

Source


1 PACKAGE BODY PV_AME_API_W AS
2 /* $Header: pvapprlb.pls 120.21 2006/12/01 20:32:21 saarumug ship $*/
3 
4 g_concurrent_update    EXCEPTION;
5 PRAGMA EXCEPTION_INIT(g_concurrent_update, -00054);
6 
7 G_PKG_NAME CONSTANT VARCHAR2(30):= 'PV_AME_API_W';
8 G_FILE_NAME CONSTANT VARCHAR2(12) := 'pvapprlb.pls';
9 
10 returnStatus CONSTANT VARCHAR2(10) := 'RETURN';
11 
12 PROCEDURE DEL_PRIOR_REP_APPR(p_approval_entity     IN  VARCHAR2
13                              , p_referral_id       IN  NUMBER
14                              , p_approval_list     IN  JTF_NUMBER_TABLE);
15 
16 PROCEDURE GET_APPROVERS(p_approval_entity     IN          VARCHAR2
17                         ,p_referral_id        IN          NUMBER
18                         ,p_mode                IN          VARCHAR2
19                         ,x_approval_list      OUT  NOCOPY JTF_NUMBER_TABLE
20                         ,x_approval_completed OUT  NOCOPY VARCHAR2
21                         ,x_default_approver   OUT  NOCOPY VARCHAR2
22                         ,x_user_id_exists     OUT  NOCOPY VARCHAR2);
23 
24 FUNCTION VALIDATE_APPROVAL (p_transaction_id      IN NUMBER
25                            , p_transaction_type  IN VARCHAR2
26                            , p_user_id           IN NUMBER
27                            , p_person_id         IN NUMBER
28                            , p_mode              IN VARCHAR2
29                            , p_approval_level    IN NUMBER
30                            , x_approver          OUT NOCOPY ame_util.approverRecord2)
31 RETURN BOOLEAN;
32 
33 PROCEDURE START_APPROVAL_PROCESS( p_api_version_number     IN  NUMBER
34                                    , p_init_msg_list       IN  VARCHAR2 := FND_API.G_FALSE
35                                    , p_commit              IN  VARCHAR2 := FND_API.G_FALSE
36                                    , p_validation_level    IN  NUMBER   := FND_API.G_VALID_LEVEL_FULL
37                                    , p_referral_id         IN  NUMBER
38                                    , p_partner_id          IN  NUMBER   DEFAULT NULL
39                                    , p_change_cntry_flag   IN  VARCHAR2  -- if ref country is changed set this to true
40                                    , p_country_code        IN  VARCHAR2 -- new country code if change_country_flag is true
41                                    , p_approval_entity     IN  VARCHAR2 -- PVREFFRL/PVDEALRN/PVDQMAPR
42                                    , x_return_status       OUT  NOCOPY VARCHAR2
43                                    , x_msg_count           OUT  NOCOPY NUMBER
44                                    , x_msg_data            OUT  NOCOPY VARCHAR2
45                                    ) IS
46 
47     l_api_name            CONSTANT VARCHAR2(30) := 'START_APPROVAL_PROCESS';
48     l_api_version_number  CONSTANT NUMBER       := 1.0;
49 
50     CURSOR lc_referral_info (pc_referral_id NUMBER) IS
51     SELECT partner_id ,benefit_id,benefit_type_code
52     FROM pv_referrals_b
53     WHERE referral_id = pc_referral_id;
54 
55     CURSOR lc_get_approver_name (pc_user_id NUMBER) IS
56     SELECT source_name FROM jtf_rs_resource_extns WHERE user_id = pc_user_id;
57 
58     CURSOR lc_prior_approvers IS
59     SELECT APPROVER_ID
60     FROM   PV_GE_TEMP_APPROVERS
61     WHERE  ARC_APPR_FOR_ENTITY_CODE = p_approval_entity
62     AND    APPR_FOR_ENTITY_ID = p_referral_id;
63 
64     cursor lc_lock_approvals is
65     SELECT entity_approver_id
66     FROM   pv_ge_temp_approvers
67     WHERE  arc_appr_for_entity_code = p_approval_entity
68     AND    appr_for_entity_id = p_referral_id
69     FOR    UPDATE NOWAIT;
70 
71     l_message_name     VARCHAR2(30);
72     l_partner_id       NUMBER;
73     l_log_params_tbl   pvx_utility_pvt.log_params_tbl_type;
74     l_approver_name    varchar2(50);
75     l_return_status    VARCHAR2(30);
76     l_msg_count        NUMBER;
77     l_msg_data         VARCHAR2(1000);
78 
79     l_appr_usr_id                    NUMBER;
80     l_isDefAppr                      BOOLEAN := false;
81     l_appr_status                    VARCHAR2(30);
82     l_benefit_id                     NUMBER;
83     l_benefit_type_code              VARCHAR2(30);
84 
85     l_approval_completed             VARCHAR2(10);
86     l_default_approver               VARCHAR2(10);
87 
88     approverUserIds                  JTF_NUMBER_TABLE;
89     l_valid_users_flag               VARCHAR2(1);
90 
91 BEGIN
92 
93     -- ********* Start Standard Initializations *******
94     SAVEPOINT START_APPROVAL_PROCESS;
95 
96     -- Standard call to check for call compatibility.
97     IF NOT FND_API.Compatible_API_Call (l_api_version_number,
98                                             p_api_version_number,
99                                             l_api_name,
100                                             'PV_AME_API_W') THEN
101                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
102     END IF;
103 
107          fnd_msg_pub.initialize;
104     -- Initialize message list if p_init_msg_list is set to TRUE.
105     IF FND_API.to_Boolean( p_init_msg_list )
106     THEN
108     END IF;
109 
110     x_return_status  :=  FND_API.G_RET_STS_SUCCESS;
111     -- ********* End Standard Initializations *********
112     IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
113         FND_LOG.MESSAGE(FND_LOG.LEVEL_PROCEDURE
114                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
115                         ,FALSE
116                         );
117     END IF;
118 
119 
120     IF p_approval_entity not in ('PVREFFRL','PVDEALRN','PVDQMAPR') THEN
121         fnd_message.Set_Name('PV', 'PV_DEBUG_MESSAGE');
122         fnd_message.Set_Token('TEXT', 'Invalid Approval Entity: ' || p_approval_entity);
123         fnd_msg_pub.Add;
124         RAISE FND_API.g_exc_error;
125     END IF;
126 
127     -- This is to make sure that no other thread of execution
128     -- can try to update the rows for this referrral in
129     -- pv_ge_temp_approvers.
130     -- Bug 4628929
131     OPEN lc_lock_approvals;
132 
133     OPEN lc_referral_info(p_referral_id);
134     FETCH lc_referral_info INTO l_partner_id, l_benefit_id, l_benefit_type_code;
135     IF lc_referral_info%NOTFOUND THEN
136         l_partner_id := p_partner_id;
137         l_benefit_type_code := p_approval_entity;
138     END IF;
139     CLOSE lc_referral_info;
140 
141 
142     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
143         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
144                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
145                         ,'After Getting partner Info..partner id:'|| l_partner_id ||
146                         ' benefit type:' || l_benefit_type_code
147                         );
148     END IF;
149 
150 
151     IF p_change_cntry_flag = 'Y' THEN
152 
153       OPEN lc_get_approver_name(pc_user_id => FND_GLOBAL.USER_ID);
154       FETCH lc_get_approver_name INTO l_approver_name;
155       CLOSE lc_get_approver_name;
156 
157       IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
158           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
159                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
160                         ,'Approver name is: ' || l_approver_name);
161 
162       END IF;
163 
164       IF p_approval_entity = 'PVREFFRL' THEN
165          l_message_name := 'PV_LG_REF_COUNTRY_CHANGE';
166       ELSIF p_approval_entity = 'PVDEALRN' THEN
167          l_message_name := 'PV_LG_DEAL_COUNTRY_CHANGE';
168       END IF;
169 
170       l_log_params_tbl(1).param_name := 'COUNTRY';
171       l_log_params_tbl(1).param_value := p_country_code;
172       l_log_params_tbl(2).param_name := 'APPROVER';
173       l_log_params_tbl(2).param_value := l_approver_name;
174 
175       update pv_referrals_b set customer_country = p_country_code where referral_id = p_referral_id;
176 
177       PVX_Utility_PVT.create_history_log(
178             p_arc_history_for_entity_code => p_approval_entity,
179             p_history_for_entity_id       => p_referral_id,
180             p_history_category_code       => 'GENERAL',
181             p_message_code                => l_message_name,
182             p_partner_id                  => l_partner_id,
183             p_access_level_flag           => 'V',
184             p_interaction_level           => pvx_utility_pvt.G_INTERACTION_LEVEL_10,
185             p_comments                    => NULL,
186             p_log_params_tbl              => l_log_params_tbl,
187             x_return_status               => l_return_status,
188             x_msg_count                   => l_msg_count,
189             x_msg_data                    => l_msg_data);
190 
191    END IF;
192 
193    AME_API2.clearAllApprovals(applicationIdIn  => 691,
194                              transactionTypeIn => p_approval_entity,
195                              transactionIdIn   => p_referral_id);
196 
197    UPDATE pv_ge_temp_approvers
198    SET    approval_status_code = 'PRIOR_APPROVER'
199    WHERE  arc_appr_for_entity_code = p_approval_entity
200    AND    appr_for_entity_id  = p_referral_id;
201 
202    IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
203        FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
204                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
205                         ,'B4 GET_APPROVERS....'
206                         );
207    END IF;
208 
209    approverUserIds := JTF_NUMBER_TABLE();
210 
211    GET_APPROVERS(p_approval_entity     => p_approval_entity
212                  ,p_referral_id        => p_referral_id
213                  ,p_mode               => 'START'
214                  ,x_approval_list      => approverUserIds
215                  ,x_approval_completed => l_approval_completed
216                  ,x_default_approver   => l_default_approver
217                  ,x_user_id_exists     => l_valid_users_flag
218                  );
219 
220    IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
221 
222        FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
223                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
224                         ,'After GET_APPROVERS:l_approval_completed ' || l_approval_completed ||
225                          ' l_default_approver ' || l_default_approver
226                         );
227    END IF;
228 
229 
230    /**
231    * This loop makes sure that if an approver from AME already exists in pv_ge_temp_approvers
232    * then that approver must be removed from pv_ge_temp_approvers so that he/she is not added
233    * again into the table.
234    */
235    FOR l_prior_appr IN lc_prior_approvers
236    LOOP
237        FOR x IN 1..approverUserIds.COUNT
238        LOOP
239            IF ( approverUserIds(x) = l_prior_appr.APPROVER_ID) THEN
240                DELETE FROM pv_ge_temp_approvers
241                WHERE  arc_appr_for_entity_code = p_approval_entity
242                AND    appr_for_entity_id  = p_referral_id
243                AND    approver_id = approverUserIds(x);
244            END IF;
245        END LOOP;
246    END LOOP;
247 
248    IF l_default_approver = 'Y' THEN
249        l_appr_status := 'PENDING_DEFAULT';
250 
251        IF approverUserIds(1) IS NULL THEN
252            fnd_message.Set_Name('PV', 'PV_DEBUG_MESSAGE');
253            fnd_message.Set_Token('TEXT', 'Could not find approver in either AME or profile');
254            fnd_msg_pub.Add;
255            RAISE FND_API.G_EXC_ERROR;
256         END IF;
257    ELSE
258       l_appr_status := 'PENDING_APPROVAL';
259    END IF;
260 
261    BEGIN
262        FORALL i IN 1..approverUserIds.COUNT
263           INSERT INTO pv_ge_temp_approvers
264           (
265            ENTITY_APPROVER_ID
266            ,OBJECT_VERSION_NUMBER
267            ,ARC_APPR_FOR_ENTITY_CODE
268            ,APPR_FOR_ENTITY_ID
269            ,APPROVER_ID
270            ,APPROVER_TYPE_CODE
271            ,APPROVAL_STATUS_CODE
272            ,WORKFLOW_ITEM_KEY
273            ,CREATED_BY
274            ,CREATION_DATE
275            ,LAST_UPDATED_BY
276            ,LAST_UPDATE_DATE
277            ,LAST_UPDATE_LOGIN
278           )
279            VALUES
280           (
281            pv_ge_temp_approvers_s.NEXTVAL
282            ,1
283            ,p_approval_entity
284            ,p_referral_id
285            ,approverUserIds(i)
286            ,'USER'
287             ,l_appr_status
288            ,null
289            ,FND_GLOBAL.USER_ID
290            ,sysdate
291            ,FND_GLOBAL.USER_ID
292            ,sysdate
293            ,FND_GLOBAL.LOGIN_ID
294           );
295    EXCEPTION
296        WHEN others THEN
297            IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
298                FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
299                                 ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
300                                 ,'Bad row index = ' || (1 +sql%rowcount) ||' ' || sqlerrm
301                                 );
302            END IF;
303    END;
304 
305    IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
306        FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
307                       ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
308                       ,'Sucessfully inserted users into pv_ge_temp_approvers...'
309                       );
310    END IF;
311 
312     IF p_change_cntry_flag = 'Y' THEN
313         -- Invoke notification API. This is to notify that the country has been changed
314         -- So even thought there is no change in status i.e. it is still in SUBMITTED_FOR_APPROVAL
315         -- there was an event of changing country which may have caused Approvers to change.
316         -- So notification is called explicitly.
317 
318         PV_BENFT_STATUS_CHANGE.STATUS_CHANGE_notification(p_api_version_number   => 1.0
319                          ,p_init_msg_list       => FND_API.G_FALSE
320                          ,p_commit              => FND_API.G_FALSE
321                          ,p_validation_level    => FND_API.G_VALID_LEVEL_FULL
322                          ,P_BENEFIT_ID          => l_benefit_id
323                          ,P_STATUS              => 'SUBMITTED_FOR_APPROVAL'
324                          ,P_ENTITY_ID           => p_referral_id
325                          ,P_PARTNER_ID          => l_partner_id
326                          ,p_user_callback_api   => 'PV_BENFT_STATUS_CHANGE.REFERRAL_RETURN_USERLIST'
327                          ,p_msg_callback_api    => 'PV_BENFT_STATUS_CHANGE.REFERRAL_SET_MSG_ATTRS'
328                          ,p_user_role           => 'BENEFIT_APPROVER'
329                          ,x_return_status       => l_return_status
330                          ,x_msg_count           => l_msg_count
331                          ,x_msg_data            => l_msg_data);
332 
333          IF l_return_status <>  FND_API.G_RET_STS_SUCCESS THEN
334              RAISE FND_API.G_EXC_ERROR;
335          END IF;
336 
337         -- Fix for Bug 5689433.
338         l_message_name := null;
339 
340         IF p_approval_entity = 'PVREFFRL' then
341             l_message_name :=   'PV_LG_REF_REQR_APPRVD_BY_USER';
342         ELSIF p_approval_entity = 'PVDEALRN' then
343             l_message_name :=   'PV_LG_DEAL_REQR_APPRVD_BY_USER';
344         ELSIF p_approval_entity = 'PVDQMAPR' then
345             l_message_name :=   'PV_LG_DQM_REQR_DEDUP_BY_USER';
346         END IF;
347 
348         if( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
349             FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE
350                            ,'pv.plsql.PV_BENFT_STATUS_CHANGE.STATUS_CHANGE_LOGGING.start'
351                            ,'Approvers notification Message:'||l_message_name);
352         end if;
353 
354         FOR  apprCnt IN 1..approverUserIds.COUNT
355         LOOP
356 
357             IF l_message_name IS NOT NULL THEN
358 
359                 l_log_params_tbl.DELETE;
360                 FOR x in (SELECT source_name FROM jtf_rs_resource_extns B WHERE  user_id = approverUserIds(apprCnt) )
361                 LOOP
362                     l_log_params_tbl(1).param_value := x.source_name;
363                 END LOOP;
364 
365                 l_log_params_tbl(1).param_name := 'APPROVER';
366 
367                 PVX_Utility_PVT.create_history_log(
368                       p_arc_history_for_entity_code => l_benefit_type_code,
369                       p_history_for_entity_id       => p_referral_id,
373                       p_access_level_flag           => 'V',
370                       p_history_category_code       => 'GENERAL',
371                       p_message_code                => l_message_name,
372                       p_partner_id                  => l_partner_id,
374                       p_interaction_level           => pvx_utility_pvt.G_INTERACTION_LEVEL_10,
375                       p_comments                    => NULL,
376                       p_log_params_tbl              => l_log_params_tbl,
377                       x_return_status               => l_return_status,
378                       x_msg_count                   => l_msg_count,
379                       x_msg_data                    => l_msg_data);
380 
381             END IF;
382 
383         END LOOP;
384 
385     END IF;
386 
387     CLOSE lc_lock_approvals;
388     -- Standard call to get message count and if count is 1, get message info.
389     FND_MSG_PUB.Count_And_Get( p_encoded   =>  FND_API.G_FALSE,
390                                 p_count     =>  x_msg_count,
391                                 p_data      =>  x_msg_data);
392 
393 EXCEPTION
394         WHEN FND_API.G_EXC_ERROR THEN
395 
396                 ROLLBACK TO START_APPROVAL_PROCESS;
397                 x_return_status := FND_API.G_RET_STS_ERROR ;
398 
399                 fnd_msg_pub.Count_And_Get(
400                        p_encoded   =>  FND_API.G_FALSE,
401                        p_count     =>  x_msg_count,
402                        p_data      =>  x_msg_data);
403 
404         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
405 
406                 ROLLBACK TO START_APPROVAL_PROCESS;
407                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
408 
409                 fnd_msg_pub.Count_And_Get(
410                    p_encoded   =>  FND_API.G_FALSE,
411                    p_count     =>  x_msg_count,
412                    p_data      =>  x_msg_data);
413 
414         WHEN g_concurrent_update THEN
415             fnd_message.Set_Name('PV', 'PV_REQUERY_THE_RECORD');
416             fnd_msg_pub.Add;
417             ROLLBACK TO UPDATE_APPROVER_RESPONSE;
418             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
419             fnd_msg_pub.Count_And_Get(
420                    p_encoded   =>  FND_API.G_FALSE,
421                    p_count     =>  x_msg_count,
422                    p_data      =>  x_msg_data);
423 
424         WHEN OTHERS THEN
425 
426                 ROLLBACK TO START_APPROVAL_PROCESS;
427                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
428 
429                 FND_MSG_PUB.Add_Exc_Msg(
430                       'PV_AME_API_W',
431                       l_api_name);
432 
433                 fnd_msg_pub.Count_And_Get(
434                   p_encoded   =>  FND_API.G_FALSE,
435                   p_count     =>  x_msg_count,
436                   p_data      =>  x_msg_data);
437 
438 END START_APPROVAL_PROCESS;
439 
440 
441 /********************************************************************************
442   This procedure starts the updates Responses given by approvers to the AME system.
443 *********************************************************************************/
444 PROCEDURE UPDATE_APPROVER_RESPONSE( p_api_version_number    IN  NUMBER
445                                     , p_init_msg_list       IN  VARCHAR2 := FND_API.G_FALSE
446                                     , p_commit              IN  VARCHAR2 := FND_API.G_FALSE
447                                     , p_validation_level    IN  NUMBER   := FND_API.G_VALID_LEVEL_FULL
448                                     , p_referral_id         IN  NUMBER
449                                     , p_approval_entity     IN  VARCHAR2 -- PVREFFRL/PVDEALRN/PVDQMAPR
450                                     , p_response            IN  VARCHAR2 -- refer to AME_UTIL.approverIn
451                                     , p_approver_user_id    IN  NUMBER -- userID of the person sending approver resp
452                                     , p_forwardee_user_id   IN  NUMBER   -- if forwarding then userID of the forwardee
453                                     , p_note_added_flag     IN  VARCHAR2 DEFAULT 'N' -- If note was added as part of this response.
454                                     , x_approval_done       OUT NOCOPY   VARCHAR2  -- True if approval process is finished False if not.
455                                     , x_return_status       OUT NOCOPY  VARCHAR2
456                                     , x_msg_count           OUT NOCOPY  NUMBER
457                                     , x_msg_data            OUT NOCOPY  VARCHAR2
458                                     ) IS
459 
460     l_api_name            CONSTANT VARCHAR2(30) := 'UPDATE_APPROVER_RESPONSE';
461     l_api_version_number  CONSTANT NUMBER       := 1.0;
462 
463     l_forwardee                      ame_util.approverRecord2;
464     l_approver                       ame_util.approverRecord2;
465     l_approval_status                VARCHAR2(30);
466     l_appr_usr_id                    NUMBER;
467     l_forwardee_user_id              NUMBER;
468     l_benefit_id                     NUMBER;
469     l_partner_id                     NUMBER;
470     l_sec_lvl_reject                 BOOLEAN;
471     l_temp                           VARCHAR2(5);
472     l_isDefAppr                      BOOLEAN;
473     l_appr_status                    VARCHAR2(20);
474     l_log_params_tbl                 pvx_utility_pvt.log_params_tbl_type;
475     l_message_code                   VARCHAR2(30);
476     l_approver_name                  VARCHAR2(100);
477     l_approver_category              VARCHAR2(30);
478     l_approver_source_id             NUMBER;
479     l_return_status                  VARCHAR2(30);
480     l_msg_count                      NUMBER;
481     l_msg_data                       VARCHAR2(1000);
485     l_ret_reason_code                VARCHAR2(30);
482     l_approver_current_status        VARCHAR2(30);
483     l_pending_status                 VARCHAR2(30);
484     l_approverInList                 BOOLEAN := false;
486     l_return_note_id                 NUMBER;
487     l_user_name                      VARCHAR2(100);
488 
489     l_approval_list                  JTF_NUMBER_TABLE;
490     l_default_approver               VARCHAR2(10);
491     l_valid_users_flag               VARCHAR2(1);
492     l_response_to_ame                VARCHAR2(25);
493     l_resp_count                     NUMBER;
494     l_curr_appr_level                NUMBER;
495 
496     cursor lc_is_default_approver (pc_user_id number, pc_benefit_type varchar2, pc_entity_id number) is
497     select approval_status_code from pv_ge_temp_approvers
498     where arc_appr_for_entity_code = pc_benefit_type
499     and appr_for_entity_id = pc_entity_id
500     and approver_type_code = 'USER'
501     and approver_id = pc_user_id
502     and approval_status_code IN ('PENDING_APPROVAL','PENDING_DEFAULT');
503 
504     cursor lc_get_approver_details (pc_user_id number) is
505     select decode(category, 'EMPLOYEE', source_id, null), category, source_name, user_name  from jtf_rs_resource_extns where user_id = pc_user_id;
506 
507     cursor lc_return_reason IS
508     select return_reason_code from pv_referrals_b
509     where  referral_id = p_referral_id;
510 
511     /**
512     * In case of referral return the note added by the user on the Notes
513     * region has to be added to the history log. This query finds that note
514     *
515     * It is mandatory to enter a note before returning a referral/deal
516     * So the last note created when a return action is submitted will have to be
517     * the note entered before returning the referral/deal. So this query
518     * sorts all the notes for this referral in desc order of entered date
519     * and picks up the first note.
520     */
521     cursor lc_return_note IS
522     select  jtf_note_id
523     from (select jtf_note_id
524           from   jtf_notes_vl
525           where  source_object_id = p_referral_id
526           and    source_object_code = p_approval_entity
527           order by entered_date desc)
528     where rownum = 1;
529 
530     cursor lc_first_level_apporver is
531     select count(entity_approver_id)
532     from pv_ge_temp_approvers
533     where arc_appr_for_entity_code = p_approval_entity
534     and appr_for_entity_id = p_referral_id
535     and approval_status_code in ('APPROVED','REJECTED');
536 
537     cursor lc_lock_approvals is
538     SELECT entity_approver_id
539     FROM   pv_ge_temp_approvers
540     WHERE  arc_appr_for_entity_code = p_approval_entity
541     AND    appr_for_entity_id = p_referral_id
542     FOR    UPDATE NOWAIT;
543 
544     CURSOR lc_prior_approvers IS
545     SELECT APPROVER_ID
546     FROM   PV_GE_TEMP_APPROVERS
547     WHERE  ARC_APPR_FOR_ENTITY_CODE = p_approval_entity
548     AND    APPR_FOR_ENTITY_ID = p_referral_id;
549 
550 
551 BEGIN
552 
553     -- ********* Start Standard Initializations *******
554     SAVEPOINT UPDATE_APPROVER_RESPONSE;
555 
556     -- Standard call to check for call compatibility.
557     IF NOT FND_API.Compatible_API_Call (l_api_version_number,
558                                         p_api_version_number,
559                                         l_api_name,
560                                         'PV_AME_API_W') THEN
561                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
562     END IF;
563 
564     -- Initialize message list if p_init_msg_list is set to TRUE.
565     IF FND_API.to_Boolean( p_init_msg_list ) THEN
566          fnd_msg_pub.initialize;
567     END IF;
568 
569     IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
570         FND_LOG.MESSAGE(FND_LOG.LEVEL_PROCEDURE
571                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
572                         ,FALSE
573                         );
574     END IF;
575 
576 
577     x_return_status  :=  FND_API.G_RET_STS_SUCCESS;
578     -- ********* End Standard Initializations *********
579 
580     -- This is to make sure that no other thread of execution
581     -- can try to update the rows for this referrral in
582     -- pv_ge_temp_approvers.
583     -- Bug 4628929
584     OPEN lc_lock_approvals;
585 
586     x_approval_done := 'N';
587 
588     OPEN lc_get_approver_details(pc_user_id => p_approver_user_id);
589     FETCH lc_get_approver_details INTO l_approver_source_id, l_approver_category, l_approver_name, l_user_name;
590     CLOSE lc_get_approver_details;
591 
592     IF p_response = AME_UTIL.forwardStatus THEN -- FORWARD
593 
594         FOR x IN (SELECT employee_id,user_name FROM fnd_user WHERE user_id = p_forwardee_user_id
595                   AND (end_date IS NULL OR end_date > sysdate-1))
596         LOOP
597             l_forwardee.orig_system_id := x.employee_id;
598             l_forwardee.name := x.user_name;
599         END LOOP;
600 
601         -- Forward case. create a forwadee record
602         l_forwardee.orig_system := 'PER';
603         l_forwardee.approver_category := ame_util.approvalApproverCategory;
604 
605         IF l_forwardee.orig_system_id IS NULL THEN
606             fnd_message.Set_Name('PV', 'PV_NO_PERSON_ERROR');
607             fnd_msg_pub.Add;
608             RAISE FND_API.g_exc_error;
609         END IF;
610 
611         l_approval_status := 'FORWARDED';
612         IF p_approval_entity = 'PVREFFRL' then
613            l_message_code :=  'PV_LG_REF_FORWARDED_BY_USER';
614         ELSIF p_approval_entity = 'PVDEALRN' then
618         IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
615            l_message_code :=  'PV_LG_DEAL_FORWARDED_BY_USER';
616         end if;
617 
619             FND_LOG.MESSAGE(FND_LOG.LEVEL_PROCEDURE
620                         ,'Forward case :b4 updateStatus call Forwardee ID :' || l_forwardee.orig_system_id||
621                         ' l_forwardee.name '||l_forwardee.name,FALSE);
622         END IF;
623 
624     ELSIF p_response = AME_UTIL.rejectStatus THEN
625 
626         OPEN lc_first_level_apporver;
627         FETCH lc_first_level_apporver INTO l_resp_count;
628         CLOSE lc_first_level_apporver;
629 
630         l_approval_status := 'REJECTED';
631         IF p_approval_entity = 'PVREFFRL' then
632            l_message_code :=   'PV_LG_REF_REJECTED_BY_USER';
633         ELSIF p_approval_entity = 'PVDEALRN' then
634            l_message_code :=   'PV_LG_DEAL_REJECTED_BY_USER';
635         end if;
636 
637     ELSIF p_response = AME_UTIL.approvedStatus THEN
638 
639         l_approval_status := 'APPROVED';
640         IF p_approval_entity = 'PVREFFRL' then
641            l_message_code :=   'PV_LG_REF_APPRVD_BY_USER';
642         ELSIF p_approval_entity = 'PVDEALRN' then
643            l_message_code :=   'PV_LG_DEAL_APPRVD_BY_USER';
644         end if;
645 
646     ELSIF p_response = returnStatus THEN
647 
648         l_approval_status := 'RETURNED';
649         IF p_approval_entity = 'PVREFFRL' then
650            l_message_code :=   'PV_LG_REF_RETURNED_BY_USER';
651         ELSIF p_approval_entity = 'PVDEALRN' then
652            l_message_code :=   'PV_LG_DEAL_RETURNED_BY_USER';
653         end if;
654 
655         OPEN lc_return_reason;
656         FETCH lc_return_reason INTO l_ret_reason_code;
657         CLOSE lc_return_reason;
658 
659         l_log_params_tbl(2).param_name := 'RETURN_REASON';
660         l_log_params_tbl(2).param_value := l_ret_reason_code;
661         l_log_params_tbl(2).param_type := 'LOOKUP';
662         l_log_params_tbl(2).param_lookup_type := 'PV_REFERRAL_RETURN_REASON';
663 
664         IF ( p_note_added_flag = 'Y' ) THEN
665             OPEN lc_return_note;
666             FETCH lc_return_note INTO l_return_note_id;
667             CLOSE lc_return_note;
668         ELSE
669             l_return_note_id := -1;
670         END IF;
671 
672         l_log_params_tbl(3).param_name := 'RETURN_NOTE';
673         l_log_params_tbl(3).param_value := l_return_note_id;
674         l_log_params_tbl(3).param_type := 'NOTE';
675 
676     END IF;
677 
678     -- If Approval Status was null it means that something other than
679     -- AME_UTIL.forwardStatus / AME_UTIL.rejectStatus / AME_UTIL.approvedStatus
680     -- was sent to the API. Hence error!!!
681     IF l_approval_status IS NULL THEN
682         fnd_message.Set_Name('PV', 'PV_DEBUG_MESSAGE');
683         fnd_message.Set_Token('TEXT', 'Possible error.  Invalid : Response ' || p_response);
684         fnd_msg_pub.Add;
685         RAISE FND_API.g_exc_error;
686     END IF;
687 
688     IF p_response = AME_UTIL.forwardStatus and p_forwardee_user_id is null then
689         fnd_message.Set_Name('PV', 'PV_REFERRAL_REASSIGN_APPROVER');
690         fnd_msg_pub.Add;
691         RAISE FND_API.g_exc_error;
692     END IF;
693 
694     open lc_is_default_approver(pc_user_id      => p_approver_user_id,
695                                 pc_benefit_type => p_approval_entity,
696                                 pc_entity_id    => p_referral_id);
697     fetch lc_is_default_approver into l_approver_current_status;
698     close lc_is_default_approver;
699 
700     IF l_approver_current_status is null then
701 
702         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
703             FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
704                       ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
705                       ,'This user ' || p_approver_user_id || ' is not an approver for entity id: ' || p_referral_id
706                       );
707         END IF;
708 
709     END IF;
710 
711     FOR x IN (SELECT partner_id FROM pv_referrals_b WHERE referral_id = p_referral_id) LOOP
712        l_partner_id := x.partner_id;
713     END LOOP;
714 
715     -- Bug fix for bug 3495565. If the current approver gets removed from the
716     -- list of approvers then skip the call to updateApprover. Treat it as a
717     -- valid response as far as our system is concerned. This call is made to
718     -- find out current user is still in the AME System.
719 
720     -- If the status is PENDING_DEFAULT then this approver did not come from
721     -- AME so there is no point checking AME for validity of the approver.
722     IF l_approver_current_status = 'PENDING_DEFAULT' THEN
723         l_approverInList := true;
724     ELSE
725         l_approverInList := VALIDATE_APPROVAL(p_transaction_id => p_referral_id
726                                          , p_transaction_type => p_approval_entity
727                                          , p_user_id => p_approver_user_id
728                                          , p_person_id => l_approver_source_id
729                                          , p_mode => 'CHECK_CURRENT_APPROVER'
730                                          , p_approval_level  => null
731                                          , x_approver => l_approver);
732     END IF;
733 
734 
735     if l_message_code is not null then -- not logging for DQM approval
736 
737         l_log_params_tbl(1).param_name := 'APPROVER';
741             FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
738         l_log_params_tbl(1).param_value := l_approver_name;
739 
740         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
742                       ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
743                       ,'Logging approver response message: ' || l_message_code
744                       );
745         END IF;
746 
747 
748         PVX_Utility_PVT.create_history_log(
749                   p_arc_history_for_entity_code => p_approval_entity,
750                   p_history_for_entity_id       => p_referral_id,
751                   p_history_category_code       => 'GENERAL',
752                   p_message_code                => l_message_code,
753                   p_partner_id                  => l_partner_id,
754                   p_access_level_flag           => 'V',
755                   p_interaction_level           => pvx_utility_pvt.G_INTERACTION_LEVEL_10,
756                   p_comments                    => NULL,
757                   p_log_params_tbl              => l_log_params_tbl,
758                   x_return_status               => l_return_status,
759                   x_msg_count                   => l_msg_count,
760                   x_msg_data                    => l_msg_data);
761 
762        if L_return_status <>  FND_API.G_RET_STS_SUCCESS then
763            raise FND_API.G_EXC_ERROR;
764        end if;
765 
766     end if;
767 
768     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
769         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
770                   ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
771                   ,'p_response ' || p_response);
772     END IF;
773 
774     -- In case of forward even if the approver is not in the list
775     -- an error will be thrown. In the other case i.e approve / reject
776     -- the AME update call is circumvented
777     IF (NOT l_approverInList AND (p_response = AME_UTIL.forwardStatus)) THEN
778 
779         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
780             FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
781                       ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
782                       ,' The approver is NOT in the list. p_response ' || p_response);
783         END IF;
784 
785         FND_MESSAGE.Set_Name('PV', 'PV_REFERRAL_REASSIGN_ERROR');
786         FND_MSG_PUB.Add;
787         RAISE FND_API.G_EXC_ERROR;
788 
789     END IF;
790 
791 
792     IF (l_approverInList) THEN
793 
794        IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
795            FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
796                       ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
797                       ,'Current User is in AME system. Sending update reponse to AME...');
798            FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
799                       ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
800                       ,'User name l_user_name '|| l_user_name ||
801                       ' FND_GLOBAL.USER_NAME '|| FND_GLOBAL.USER_NAME
802                       );
803 
804        END IF;
805       IF l_approver_current_status = 'PENDING_APPROVAL' THEN
806 
807           IF p_response = AME_UTIL.forwardStatus THEN
808 
809               IF (l_approver.authority = ame_util.authorityApprover AND
810                   (l_approver.api_insertion = ame_util.apiAuthorityInsertion
811                    OR l_approver.api_insertion = ame_util.oamGenerated) ) THEN
812 
813                   l_forwardee.api_insertion := ame_util.apiAuthorityInsertion;
814 
815               ELSE
816 
817                   l_forwardee.api_insertion := ame_util.apiInsertion;
818 
819               END IF;
820 
821               l_forwardee.authority := l_approver.authority;
822 
823           END IF;
824 
825 
826           /*
827           * AME does not have the concept of RETURNing a transaction during approval
828           * but PRM does. As far as AME is concerned a return is equivalent to a
829           * Rejection. So we pass AME_UTIL.rejectStatus to AME in case of a RETURN
830           */
831           IF p_response = returnStatus THEN
832               l_response_to_ame := AME_UTIL.rejectStatus;
833           ELSE
834               l_response_to_ame := p_response;
835           END IF;
836 
837           ame_api2.updateApprovalStatus2
838               (applicationIdIn     => 691
839               , transactionTypeIn => p_approval_entity
840               , transactionIdIn   => p_referral_id
841               , approvalStatusIn  => l_response_to_ame
842               , approverNameIn    => l_user_name
843               , itemClassIn       => null
844               , itemIdIn          => null
845               , actionTypeIdIn    => null
846               , groupOrChainIdIn  => null
847               , occurrenceIn      => null
848               , forwardeeIn       => l_forwardee
849               , updateItemIn      => null
850              );
851 
852           IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
853               FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
854                       ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
855                       ,'After AME_API.updateApprovalStatus2 call...'
856                       );
857           END IF;
858 
859       END IF;
860 
861     ELSE
862 
863        IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
864            FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
865                       ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
866                       ,'Current User is no more in the AME System as an approver. AME was not updated...'
867                       );
868        END IF;
869 
870     END IF; -- If current user is in AME system.
871 
872     -- Update pv_ge_temp_approvers to set the values of approval status to
873     -- APPROVED/REJECTED/FORWARDED depending on the case for the approver id who
874     -- took the action.
875     UPDATE pv_ge_temp_approvers
876     SET    approval_status_code = l_approval_status
877     WHERE  arc_appr_for_entity_code = p_approval_entity
878     AND    appr_for_entity_id = p_referral_id
879     AND    approver_id = p_approver_user_id
880     AND    approval_status_code IN ('PENDING_APPROVAL','PENDING_DEFAULT')
881     AND    rownum = 1;
882 
883     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
884         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
885                       ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
886                       ,'Set the approval status for '|| p_approval_entity || ', ' || p_referral_id ||
887                       'User id: ' || p_approver_user_id || ' to '||l_approval_status
888                       );
889     END IF;
890 
891 
892     IF p_response = AME_UTIL.approvedStatus or p_response = AME_UTIL.forwardStatus THEN
893 
894         IF p_approval_entity = 'PVDQMAPR' THEN
895            x_approval_done := 'Y';
896 
897            /* In case of DQM approval the first response is the only response
898            *  that counts. So regardless of whether the approval is of type
899            *  first responder wins / serial / consensus/order number
900            *  the first person to respond closes the DQM approval process and
904 
901            *  all others will be marked as PEER_RESPONDED
902            */
903            IF l_approver_current_status = 'PENDING_APPROVAL' THEN
905                UPDATE pv_ge_temp_approvers
906                SET    approval_status_code = 'PEER_RESPONDED'
907                WHERE  arc_appr_for_entity_code = p_approval_entity
908                AND    appr_for_entity_id = p_referral_id
909                AND    approval_status_code IN ('PENDING_APPROVAL');
910 
911            END IF;
912 
913         ELSE
914 
915             -- If it is PENDING_APPROVAL only then do we go to next level of
916             -- Approval. If it is PENDING_DEFAULT then that level is
917             -- considered the last level of approval
918             IF l_approver_current_status = 'PENDING_APPROVAL' THEN
919 
920                 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
921                     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
922                                   ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
923                                   ,'B4 getNextApprover....'
924                                   );
925                 END IF;
926 
927                 BEGIN
928                     GET_APPROVERS(p_approval_entity => p_approval_entity
929                               ,p_referral_id        => p_referral_id
930                               ,p_mode               => 'UPDATE'
931                               ,x_approval_list      => l_approval_list
932                               ,x_approval_completed => x_approval_done
933                               ,x_default_approver   => l_default_approver
934                               ,x_user_id_exists     => l_valid_users_flag);
935                 EXCEPTION
936                 WHEN OTHERS THEN
937                     -- log error message by AME
938                     IF fnd_msg_pub.Check_Msg_Level (fnd_msg_pub.G_MSG_LVL_DEBUG_LOW) THEN
939                         FND_MSG_PUB.Add_Exc_Msg('PV_AME_API_W',l_api_name);
940                     END IF;
941                     RAISE;
942                 END;
943 
944                 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
945                     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
946                                   ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
947                                   ,'After getNextApprover....l_approval_list '||l_approval_list.COUNT ||
948                                   'After getNextApprover....x_approval_done '||x_approval_done||
949                                   'After getNextApprover....l_default_approver '||l_default_approver ||
950                                   'After getNextApprover....l_valid_users_flag '||l_valid_users_flag
951                                   );
952                 END IF;
953 
954                 IF ( l_valid_users_flag = 'N' ) THEN
955                     FND_MESSAGE.Set_Name('PV', 'PV_NO_USER_FOR_PERSON_ERROR');
956                     FND_MSG_PUB.Add;
957                     RAISE FND_API.g_exc_error;
958                 END IF;
959 
960 
961                 IF ((l_approval_list IS NULL OR l_approval_list.COUNT < 1)
962                     AND p_response = AME_UTIL.forwardStatus)
963                 THEN
964 
965                     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
966                         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
967                                   ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
968                                   ,'Even After forwarding l_approval_list is '||l_approval_list.COUNT);
969                     END IF;
970 
971                     FND_MESSAGE.Set_Name('PV', 'PV_REFERRAL_NO_FORWARDEE');
972                     FND_MSG_PUB.Add;
973                     RAISE FND_API.g_exc_error;
974                 END IF;
975 
976                 DEL_PRIOR_REP_APPR(p_approval_entity => p_approval_entity
977                                    ,p_referral_id    => p_referral_id
978                                    ,p_approval_list  => l_approval_list);
979 
980                 l_curr_appr_level := l_approver.approver_order_number; -- Bug 5256368 (Consensus Issue)
981 
982                 /*
983                 *  We need to set the approvers who did not respond to PEER_RESPONDED.
984                 *  However if there are any approvers who are yet to approve in AME we
985                 *  cannot set their status to PEER_RESPONDED. This case will occur in case
986                 *  of CONSENSUS where multiple approvers need to respond before the entity
987                 *  is APPROVED.
988                 *  So if approvers have been returned from AME check for consensus case and
989                 *  only then update current approvers to PEER_APPROVED
990 		*
991 		*   Bug fix 5256368: Remove approver from FRW case. If the current approver
992 		*   is no longer in the list then updates to other approvers rows is not to
993 		*   be allowed.
994                 */
995                 IF (NOT VALIDATE_APPROVAL(p_transaction_id => p_referral_id
996                                          , p_transaction_type => p_approval_entity
997                                          , p_user_id => p_approver_user_id
998                                          , p_person_id => l_approver_source_id
999                                          , p_mode => 'CHECK_PENDING_APPROVERS'
1000                                          , p_approval_level  => l_curr_appr_level
1001                                          , x_approver => l_approver) AND l_approverInList)
1002                 THEN
1003                     UPDATE pv_ge_temp_approvers
1004                     SET    approval_status_code = 'PEER_RESPONDED'
1005                     WHERE  arc_appr_for_entity_code = p_approval_entity
1006                     AND    appr_for_entity_id = p_referral_id
1010                 l_pending_status := 'PENDING_APPROVAL';
1007                     AND    approval_status_code = 'PENDING_APPROVAL';
1008                 END IF;
1009 
1011 
1012             ELSE
1013 
1014                 -- l_approver_current_status = 'PENDING_DEFAULT'
1015                 IF p_response = AME_UTIL.forwardStatus THEN
1016                     x_approval_done := 'N';
1017                     l_approval_list := JTF_NUMBER_TABLE();
1018                     l_approval_list.EXTEND();
1019                     l_approval_list(1) := p_forwardee_user_id;
1020                     l_pending_status := 'PENDING_DEFAULT';
1021 
1022                     DEL_PRIOR_REP_APPR(p_approval_entity => p_approval_entity
1023                                        ,p_referral_id    => p_referral_id
1024                                        ,p_approval_list  => l_approval_list);
1025 
1026                 ELSE
1027                     x_approval_done := 'Y';
1028                 END IF;
1029             END IF;
1030 
1031 
1032             IF l_approval_list IS NOT NULL AND l_approval_list.COUNT > 0
1033             THEN
1034                 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1035                     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1036                                   ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
1037                                   ,'Inserting users into pv_ge_temp_approvers...'
1038                                   );
1039                 END IF;
1040 
1041                 BEGIN
1042                 FORALL i IN 1..l_approval_list.COUNT
1043 
1044 
1045                     INSERT INTO pv_ge_temp_approvers(
1046                         ENTITY_APPROVER_ID
1047                         ,OBJECT_VERSION_NUMBER
1048                         ,ARC_APPR_FOR_ENTITY_CODE
1049                         ,APPR_FOR_ENTITY_ID
1050                         ,APPROVER_ID
1051                         ,APPROVER_TYPE_CODE
1052                         ,APPROVAL_STATUS_CODE
1053                         ,WORKFLOW_ITEM_KEY
1054                         ,CREATED_BY
1055                         ,CREATION_DATE
1056                         ,LAST_UPDATED_BY
1057                         ,LAST_UPDATE_DATE
1058                         ,LAST_UPDATE_LOGIN
1059                     )VALUES(
1060                         pv_ge_temp_approvers_s.NEXTVAL
1061                         ,1
1062                         ,p_approval_entity
1063                         ,p_referral_id
1064                         ,l_approval_list(i)
1065                         ,'USER'
1066                         ,l_pending_status
1067                         ,null
1068                         ,FND_GLOBAL.USER_ID
1069                         ,sysdate
1070                         ,FND_GLOBAL.USER_ID
1071                         ,sysdate
1072                         ,FND_GLOBAL.LOGIN_ID
1073                     );
1074 
1075                 EXCEPTION
1076                    WHEN others THEN
1077                        IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1078                            FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1079                                 ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
1080                                 ,'Bad row index = ' || (1 +sql%rowcount) ||' ' || sqlerrm
1081                                 );
1082                        END IF;
1083 
1084                 END;
1085 
1086                 IF p_approval_entity = 'PVREFFRL' then
1087                     l_message_code :=   'PV_LG_REF_REQR_APPRVD_BY_USER';
1088                 ELSIF p_approval_entity = 'PVDEALRN' then
1089                     l_message_code :=   'PV_LG_DEAL_REQR_APPRVD_BY_USER';
1090                 END IF;
1091 
1092                 FOR  apprCnt IN 1..l_approval_list.COUNT
1093                 LOOP
1094 
1095                     FOR x in (SELECT source_name FROM jtf_rs_resource_extns B WHERE  user_id = l_approval_list(apprCnt) )
1096                     LOOP
1097                        l_log_params_tbl(1).param_value := x.source_name;
1098                     END LOOP;
1099 
1100                     l_log_params_tbl(1).param_name := 'APPROVER';
1101 
1102                     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1103                            FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1104                                 ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
1105                                 ,'Logging who the next approver is: ' || l_approver_name
1106                                 );
1107                     END IF;
1108 
1109                     PVX_Utility_PVT.create_history_log(
1110                             p_arc_history_for_entity_code => p_approval_entity,
1111                             p_history_for_entity_id       => p_referral_id,
1112                             p_history_category_code       => 'GENERAL',
1113                             p_message_code                => l_message_code,
1114                             p_partner_id                  => l_partner_id,
1115                             p_access_level_flag           => 'V',
1116                             p_interaction_level           => pvx_utility_pvt.G_INTERACTION_LEVEL_10,
1117                             p_comments                    => NULL,
1118                             p_log_params_tbl              => l_log_params_tbl,
1119                             x_return_status               => l_return_status,
1120                             x_msg_count                   => l_msg_count,
1121                             x_msg_data                    => l_msg_data);
1122 
1123                 END LOOP;
1124             END IF; -- If Approval is done
1125         END IF; -- Id it is PENDING_APPROVAL
1126 
1130         -- referral approval process is not to be restarted. Conversely, in all cases of
1127     ELSIF p_response = AME_UTIL.rejectStatus THEN -- never the case for DQM
1128 
1129         -- In Case of DECLINE the response is rejectStatus. In this case however the
1131         -- rejectStatus response other than DECLINED the approval process is restarted.
1132         IF l_resp_count > 0 THEN
1133             -- When an approval is Reject the approval process has to be restarted
1134             -- as if it is being approved for the first time again.
1135             --
1136             -- So the referral goes back to SUBMITTED_FOR_APPROVAL and new approvers
1137             -- are notified.
1138 
1139             BEGIN
1140 
1141                 -- restart approval process
1142                 START_APPROVAL_PROCESS(p_api_version_number  => 1.0
1143                    ,p_init_msg_list       => FND_API.G_FALSE
1144                    ,p_commit              => FND_API.G_FALSE
1145                    ,p_validation_level    => 90 --fnd_api.g_valid_level_full,
1146                    ,p_referral_id         => p_referral_id
1147                    ,p_change_cntry_flag   => 'N'
1148                    ,p_country_code        => NULL
1149                    ,p_approval_entity     => p_approval_entity
1150                    ,x_return_status       => l_return_status
1151                    ,x_msg_count           => l_msg_count
1152                    ,x_msg_data            => l_msg_data);
1153 
1154                 IF L_return_status <>  FND_API.G_RET_STS_SUCCESS THEN
1155                     RAISE FND_API.G_EXC_ERROR;
1156                 END IF;
1157 
1158                 x_approval_done := 'N';
1159             EXCEPTION
1160                 WHEN no_data_found THEN
1161                     x_approval_done := 'Y';
1162                 WHEN OTHERS THEN
1163                     RAISE;
1164             END;
1165 
1166         END IF;
1167 
1168     END IF; -- End of REJECTED CASE
1169 
1170     CLOSE lc_lock_approvals;
1171 
1172     IF x_approval_done <> 'Y' THEN
1173         -- Send Notification
1174         FOR x IN (SELECT partner_id ,benefit_id FROM pv_referrals_b WHERE referral_id = p_referral_id) LOOP
1175             l_benefit_id := x.benefit_id;
1176             l_partner_id := x.partner_id;
1177         END LOOP;
1178 
1179         PV_BENFT_STATUS_CHANGE.STATUS_CHANGE_notification(p_api_version_number   => 1.0
1180                                 ,p_init_msg_list       => FND_API.G_FALSE
1181                                 ,p_commit              => FND_API.G_FALSE
1182                                 ,p_validation_level    => FND_API.G_VALID_LEVEL_FULL
1183                                 ,P_BENEFIT_ID          => l_benefit_id
1184                                 ,P_STATUS              => 'SUBMITTED_FOR_APPROVAL'
1185                                 ,P_ENTITY_ID           => p_referral_id
1186                                 ,P_PARTNER_ID          => l_partner_id
1187                                 ,p_user_callback_api   => 'PV_BENFT_STATUS_CHANGE.REFERRAL_RETURN_USERLIST'
1188                                 ,p_msg_callback_api    => 'PV_BENFT_STATUS_CHANGE.REFERRAL_SET_MSG_ATTRS'
1189                                 ,p_user_role           => 'BENEFIT_APPROVER'
1190                                 ,x_return_status       => l_return_status
1191                                 ,x_msg_count           => l_msg_count
1192                                 ,x_msg_data            => l_msg_data);
1193 
1194         IF l_return_status <>  FND_API.G_RET_STS_SUCCESS THEN
1195             RAISE FND_API.G_EXC_ERROR;
1196         END IF;
1197     END IF;
1198 
1199     -- Standard call to get message count and if count is 1, get message info.
1200     FND_MSG_PUB.Count_And_Get( p_encoded   =>  FND_API.G_FALSE,
1201                                 p_count     =>  x_msg_count,
1202                                 p_data      =>  x_msg_data);
1203 
1204 EXCEPTION
1205 
1206         WHEN FND_API.G_EXC_ERROR THEN
1207 
1208                 ROLLBACK TO UPDATE_APPROVER_RESPONSE;
1209                 x_return_status := FND_API.G_RET_STS_ERROR ;
1210 
1211                 fnd_msg_pub.Count_And_Get(
1212                        p_encoded   =>  FND_API.G_FALSE,
1213                        p_count     =>  x_msg_count,
1214                        p_data      =>  x_msg_data);
1215 
1216         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1217 
1218                 ROLLBACK TO UPDATE_APPROVER_RESPONSE;
1219                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1220 
1221                 fnd_msg_pub.Count_And_Get(
1222                    p_encoded   =>  FND_API.G_FALSE,
1223                    p_count     =>  x_msg_count,
1224                    p_data      =>  x_msg_data);
1225 
1226         WHEN g_concurrent_update THEN
1227             fnd_message.Set_Name('PV', 'PV_REQUERY_THE_RECORD');
1228             fnd_msg_pub.Add;
1229 
1230             ROLLBACK TO UPDATE_APPROVER_RESPONSE;
1231             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1232             fnd_msg_pub.Count_And_Get(
1233                    p_encoded   =>  FND_API.G_FALSE,
1234                    p_count     =>  x_msg_count,
1235                    p_data      =>  x_msg_data);
1236 
1237         WHEN OTHERS THEN
1238 
1239                 ROLLBACK TO UPDATE_APPROVER_RESPONSE;
1240                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1241 
1242                 FND_MSG_PUB.Add_Exc_Msg('PV_AME_API_W', l_api_name);
1243 
1244                 fnd_msg_pub.Count_And_Get(
1245                   p_encoded   =>  FND_API.G_FALSE,
1246                   p_count     =>  x_msg_count,
1247                   p_data      =>  x_msg_data);
1248 
1249 END UPDATE_APPROVER_RESPONSE;
1250 
1251 /*
1255 * - CHECK_CURRENT_APPROVER: Validate if the current logged in user is a
1252 * This function queries for the latest set of approvers pending approval
1253 * in AME. With the list of approvers returned by AME we can perform certain
1254 * validations.
1256 *   a valid approver in AME.
1257 * - CHECK_PENDING_APPROVERS: Check if AME is waiting for response from any of
1258 *   the current set of approvers in pv_ge_temp_approvers. (Consensus case)
1259 */
1260 FUNCTION VALIDATE_APPROVAL (p_transaction_id     IN NUMBER
1261                            , p_transaction_type  IN VARCHAR2
1262                            , p_user_id           IN NUMBER
1263                            , p_person_id         IN NUMBER
1264                            , p_mode              IN VARCHAR2
1265                            , p_approval_level    IN NUMBER
1266                            , x_approver          OUT NOCOPY ame_util.approverRecord2)
1267 RETURN BOOLEAN IS
1268 
1269     CURSOR c_user(pc_person_id NUMBER) IS
1270     SELECT 'Y'
1271     FROM   fnd_user A , pv_ge_temp_approvers appr
1272     WHERE  A.employee_id = pc_person_id
1273     AND    ( A.end_date IS NULL OR A.end_date > sysdate-1)
1274     AND    A.user_id = appr.approver_id
1275     AND    appr.approval_status_code = 'PENDING_APPROVAL'
1276     AND    appr.APPR_FOR_ENTITY_ID = p_transaction_id
1277     AND    appr.ARC_APPR_FOR_ENTITY_CODE = p_transaction_type;
1278 
1279     l_is_valid  BOOLEAN := false;
1280     l_usr_resp_pending VARCHAR2(1) := 'N';
1281     l_approversOut      ame_util.approversTable;
1282 
1283     x_approvalProcessCompleteYNOut VARCHAR2(10);
1284     x_nextApproversOut ame_util.approversTable2; -- New API approverOut
1285     currApprRec ame_util.approverRecord2;
1286 
1287     xitemIndexesOut ame_util.idList;
1288     xitemClassesOut ame_util.stringList;
1289     xitemIdsOut ame_util.stringList;
1290     xitemSourcesOut ame_util.longStringList;
1291 
1292  BEGIN
1293      -- get all the approver list and loop till you find the matching
1294      -- and set the flag to true if you find any.
1295      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1296          FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1297                                 ,'pv.plsql.' || g_pkg_name || '.VALIDATE_APPROVAL'
1298                                 ,'before  getPendingApprovers  ' || p_transaction_id ||
1299                                 ' '|| p_transaction_type || ' p_user_id ' || p_user_id ||
1300                                 ' p_person_id '|| p_person_id||' p_mode '|| p_mode ||
1301 				' p_approval_level '|| p_approval_level
1302                                 );
1303      END IF;
1304 
1305 
1306      ame_api2.getPendingApprovers(applicationIdIn => 691,
1307                                 transactionTypeIn => p_transaction_type,
1308                                 transactionIdIn => p_transaction_id,
1309                                 approvalProcessCompleteYNOut => x_approvalProcessCompleteYNOut,
1310                                 approversOut => x_nextApproversOut);
1311 
1312     IF ( p_mode = 'CHECK_CURRENT_APPROVER' ) THEN
1313 
1314         FOR i IN 1..x_nextApproversOut.count LOOP
1315             currApprRec := x_nextApproversOut(i);
1316 
1317             IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1318                 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1319                                         ,'pv.plsql.' || g_pkg_name || '.VALIDATE_APPROVAL'
1320                                         ,'currApprRec.orig_system_id ' || currApprRec.orig_system_id
1321                                         );
1322             END IF;
1323 
1324 	    IF (p_person_id = currApprRec.orig_system_id)  THEN
1325                 l_is_valid := true;
1326                 x_approver := currApprRec;
1327                 EXIT;
1328             END IF;
1329         END LOOP;
1330 
1331     ELSIF ( p_mode = 'CHECK_PENDING_APPROVERS' ) THEN
1332 
1333         FOR i IN 1..x_nextApproversOut.count LOOP
1334             currApprRec := x_nextApproversOut(i);
1335 
1336             IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1337                 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1338                                         ,'pv.plsql.' || g_pkg_name || '.VALIDATE_APPROVAL'
1339                                         ,'currApprRec.orig_system_id ' || currApprRec.orig_system_id||
1340 					'currApprRec.orig_system_id ' || currApprRec.approver_order_number
1341                                         );
1342             END IF;
1343 
1344             /**
1345             * Consensus case is true if there are person/persons in AME
1346             * at the same approval level as the person currently approving
1347             * e.g. Say the approval process looks like this
1348             * Level 1 : A, B
1349             * Level 2 : A
1350             * A level 1 and A level 2 are distinct. If level 1 is consensus and B
1351             * approves the A returned by getPendingApprovers will have order number as 1
1352             * as opposed to FRW case where A will have an order number 2 since it will be
1353             * the A from level 2.
1354             */
1355             IF ( p_approval_level = currApprRec.approver_order_number )
1356             THEN
1357                 OPEN c_user(currApprRec.orig_system_id);
1358                 FETCH c_user INTO l_usr_resp_pending;
1359                 CLOSE c_user;
1360 
1361                 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1362                     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1363                                    ,'pv.plsql.' || g_pkg_name || '.VALIDATE_APPROVAL'
1367 
1364                                    ,'RESPONSES PENDING ? l_usr_resp_pending ' || l_usr_resp_pending
1365                                    );
1366                 END IF;
1368                 IF ( l_usr_resp_pending = 'Y' ) THEN
1369                     l_is_valid := true;
1370                     EXIT;
1371                 END IF;
1372             END IF;
1373         END LOOP;
1374     END IF;
1375 
1376     RETURN l_is_valid;
1377 
1378 EXCEPTION
1379     WHEN OTHERS THEN
1380         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1381             FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1382                                 ,'pv.plsql.' || g_pkg_name || '.VALIDATE_APPROVAL'
1383                                 ,'Error in getPendingApprovers '||SQLCODE ||
1384                                 ': ' || SQLERRM);
1385         END IF;
1386         FND_MESSAGE.Set_Name('PV', 'PV_REFERRAL_APPROVAL_ERROR');
1387         FND_MSG_PUB.Add;
1388         RAISE FND_API.G_EXC_ERROR;
1389 
1390 END VALIDATE_APPROVAL;
1391 
1392 PROCEDURE GET_APPROVERS(p_approval_entity     IN          VARCHAR2
1393                         ,p_referral_id        IN          NUMBER
1394                         ,p_mode               IN          VARCHAR2
1395                         ,x_approval_list      OUT  NOCOPY JTF_NUMBER_TABLE
1396                         ,x_approval_completed OUT  NOCOPY VARCHAR2
1397                         ,x_default_approver   OUT  NOCOPY VARCHAR2
1398                         ,x_user_id_exists     OUT  NOCOPY VARCHAR2)
1399 IS
1400     l_api_name     VARCHAR2(20) := 'GET_APPROVERS';
1401 
1402     x_nextApproverOut                ame_util.approverRecord; -- Old API approverOut
1403 
1404     x_approvalProcessCompleteYNOut VARCHAR2(100);
1405     x_nextApproversOut ame_util.approversTable2; -- New API approverOut
1406     currApprRec ame_util.approverRecord2;
1407 
1408     xitemIndexesOut ame_util.idList;
1409     xitemClassesOut ame_util.stringList;
1410     xitemIdsOut ame_util.stringList;
1411     xitemSourcesOut ame_util.longStringList;
1412     xproductionIndexesOut ame_util.idList;
1413     xvariableNamesOut ame_util.stringList;
1414     xvariableValuesOut ame_util.stringList;
1415     xtransVariableNamesOut ame_util.stringList;
1416     xtransVariableValuesOut ame_util.stringList;
1417 
1418     l_valid_user_for_person VARCHAR2(1) :=  'Y';
1419     l_orig_system VARCHAR2(20);
1420     l_exception_flag VARCHAR2(1) := 'N';
1421 
1422 BEGIN
1423     IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1424         FND_LOG.MESSAGE(FND_LOG.LEVEL_PROCEDURE
1425                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
1426                         ,FALSE
1427                         );
1428     END IF;
1429 
1430     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1431         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1432                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
1433                         ,'inside GET_APPROVERS p_approval_entity '||p_approval_entity ||
1434                           ' p_referral_id ' || p_referral_id
1435                         );
1436     END IF;
1437 
1438     -- This BEGIN ... END is to trap any errors that is thrown from AME. In that
1439     -- case the list of approvers will be empty and approval would not be
1440     -- marked as complete. In those cases the default approver is to be picked up.
1441     BEGIN
1442         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1443             FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1444                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
1445                         ,'GET_APPROVERS Calling new APIs '
1446                         );
1447         END IF;
1448         x_approval_list := JTF_NUMBER_TABLE();
1449 
1450         AME_API2.getNextApprovers3(applicationIdIn => 691
1451                                     ,transactionTypeIn => p_approval_entity
1452                                     ,transactionIdIn => p_referral_id
1453                                     ,flagApproversAsNotifiedIn => ame_util.booleanTrue
1454                                     ,approvalProcessCompleteYNOut => x_approvalProcessCompleteYNOut
1455                                     ,nextApproversOut => x_nextApproversOut
1456                                     ,itemIndexesOut => xitemIndexesOut
1457                                     ,itemClassesOut => xitemClassesOut
1458                                     ,itemIdsOut => xitemIdsOut
1459                                     ,itemSourcesOut => xitemSourcesOut
1460                                     ,productionIndexesOut => xproductionIndexesOut
1461                                     ,variableNamesOut => xvariableNamesOut
1462                                     ,variableValuesOut => xvariableValuesOut
1463                                     ,transVariableNamesOut => xtransVariableNamesOut
1464                                     ,transVariableValuesOut => xtransVariableValuesOut);
1465 
1466         --x_approval_list.EXTEND(x_nextApproversOut.COUNT);
1467 
1468         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1469             FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1470                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
1471                         ,'GET_APPROVERS x_nextApproversOut.COUNT '||x_nextApproversOut.COUNT
1472                         );
1473         END IF;
1474 
1475         FOR i IN 1..x_nextApproversOut.COUNT
1476         LOOP
1477 
1478             currApprRec := x_nextApproversOut(i);
1479             l_orig_system    := currApprRec.orig_system;
1483                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
1480 
1481             IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1482                 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1484                         ,'GET_APPROVERS l_orig_system '||l_orig_system
1485                         );
1486             END IF;
1487 
1488             /**
1489             * Referral/Deals support only internal users as approvers.
1490             *
1491             * AME supports the following types of approvers
1492             * Persons, Users , Workflow Roles
1493             *
1494             * Persons are always internal users so Refereals can support all PER.
1495             * However Referral/Deal module convers all person_id to user_id
1496             * before saving to PV_GE_TEMP_APPROVERS. All of the queries in this
1497             * module is centered around the assumption that approver column will always
1498             * have a USER_ID. Also in order to approve referrals and deals the user
1499             * has to login to the system and approve. It is not possible to do it
1500             * from an email or any other way without logging into the system. So
1501             * it is safe to assume that only persons with valid USER accounts can
1502             * be approvers in case of Referrals/Deals
1503             *
1504             * Users from AME are all users that are not internal users. These are not
1505             * supported since only internal users can be approvers.
1506             *
1507             * Workflow roles. PRM does not support this type.
1508             * --------------------------------------------------------------
1509             * -- IN SHORT ONLY 'PER' WITH VALID USER ACCOUNT IS SUPPORTED --
1510             * --------------------------------------------------------------
1511             **/
1512             x_user_id_exists := 'N';
1513 
1514             IF (l_orig_system = 'PER') THEN
1515 
1516                 FOR x IN (SELECT A.user_id FROM fnd_user A, jtf_rs_resource_extns B
1517                           WHERE  employee_id = currApprRec.orig_system_id
1518                           AND    A.user_id = B.user_id
1519                           AND    ( A.end_date IS NULL OR A.end_date > sysdate-1) )
1520                 LOOP
1521 
1522                     x_approval_list.EXTEND();
1523                     x_approval_list(x_approval_list.COUNT) := x.user_id;
1524                     x_user_id_exists := 'Y';
1525                 END LOOP;
1526 
1527                 IF (x_user_id_exists = 'N') THEN
1528                     EXIT;
1529                 END IF;
1530             END IF;
1531 
1532             IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1533                 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1534                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
1535                         ,'GET_APPROVERS x_approval_completed '||x_approval_completed
1536                         );
1537             END IF;
1538 
1539         END LOOP;
1540 
1541         x_approval_completed := x_approvalProcessCompleteYNOut;
1542         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1543             FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1544                         ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
1545                         ,'GET_APPROVERS x_approval_completed '||x_approval_completed
1546                         );
1547         END IF;
1548 
1549 
1550     EXCEPTION
1551     WHEN OTHERS THEN
1552         -- log error message by AME
1553         IF fnd_msg_pub.Check_Msg_Level (fnd_msg_pub.G_MSG_LVL_DEBUG_LOW) THEN
1554             FND_MSG_PUB.Add_Exc_Msg('PV_AME_API_W',l_api_name);
1555         END IF;
1556         l_exception_flag := 'Y';
1557 
1558         IF p_mode = 'UPDATE' THEN
1559             RAISE;
1560         END IF;
1561     END;
1562 
1563     /**
1564     *  Default approver needs to be picked up under the following conditions
1565     *
1566     *  IF AME IS BEING CALLED FOR THE FIRST TIME FOR THIS ENTITY
1567     *  AND ANY ONE OF THE BELOW CASES
1568     *    - AME DID NOT RETURN ANY ONE (MAYBE NO RULE WAS SETUP OR ANY OTHER REASON)
1569     *    OR
1570     *    - THERE WAS SOME EXCEPTION IN AME
1571     *    OR
1572     *    - AME RETURNED A PERSON WITH INVALID USER ACCOUNT
1573     *
1574     *  A DEFAULT APPROVER IS NEVER CHOSEN IN CASE OF A SUBSEQUENT LEVEL APPROVAL
1575     **/
1576 
1577     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1578         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1579                        ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
1580                        ,'p_mode '||p_mode||' x_nextApproversOut.COUNT ' || x_nextApproversOut.COUNT ||
1581                        ' l_exception_flag '||l_exception_flag||' x_user_id_exists ' || x_user_id_exists);
1582     END IF;
1583 
1584     IF (p_mode = 'START') THEN
1585 
1586          IF (x_nextApproversOut.COUNT < 1 --x_approval_completed = 'Y' AME changed
1587              OR l_exception_flag = 'Y'
1588              OR x_user_id_exists = 'N') THEN
1589 
1590                 x_default_approver := 'Y';
1591 
1592                 -- clearing the table in case there were any already existing
1593                 -- valid users in list.
1594                 x_approval_list := JTF_NUMBER_TABLE();
1595                 x_approval_list.EXTEND(1);
1596 
1597                 IF p_approval_entity = 'PVREFFRL' THEN
1598                     x_approval_list(1) := FND_PROFILE.Value('PV_DEFAULT_REFERRAL_APPROVER');
1599                 ELSIF p_approval_entity = 'PVDEALRN' THEN
1600                     x_approval_list(1) := FND_PROFILE.Value('PV_DEFAULT_DEAL_APPROVER');
1601                 ELSIF p_approval_entity = 'PVDQMAPR' THEN
1602                     x_approval_list(1) := FND_PROFILE.Value('PV_DEFAULT_DQM_APPROVER');
1603                 END IF;
1604 
1605                 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1606                     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT
1607                                 ,'pv.plsql.' || g_pkg_name || '.' || l_api_name
1608                                 ,'Approver from profile for '||p_approval_entity||' is ' || x_approval_list(1)
1609                                 );
1610                 END IF;
1611         END IF; -- completed or exception or invalid user
1612 
1613     END IF; -- p_mode is START
1614 
1615 
1616 EXCEPTION
1617 
1618     WHEN OTHERS THEN
1619         IF fnd_msg_pub.Check_Msg_Level (fnd_msg_pub.G_MSG_LVL_DEBUG_LOW) THEN
1620             FND_MSG_PUB.Add_Exc_Msg('PV_AME_API_W',l_api_name);
1621         END IF;
1622 END GET_APPROVERS;
1623 
1624 
1625 PROCEDURE DEL_PRIOR_REP_APPR(p_approval_entity     IN  VARCHAR2
1626                              , p_referral_id       IN  NUMBER
1627                              , p_approval_list     IN  JTF_NUMBER_TABLE)
1628 IS
1629     CURSOR lc_prior_approvers IS
1630     SELECT APPROVER_ID
1631     FROM   PV_GE_TEMP_APPROVERS
1632     WHERE  ARC_APPR_FOR_ENTITY_CODE = p_approval_entity
1633     AND    APPR_FOR_ENTITY_ID = p_referral_id;
1634 
1635 BEGIN
1636 
1637     /** BUG 5523142
1638     * To open up the visibility of the deal/referral to approvers who had rejected before we need to
1639     * maintain all the rows that were previously created for a prior approval process. If the people
1640     * on the current approvers list from AME are in the prior approver list they need to be removed
1641     * before rows for new set of approvers are created.
1642     */
1643     FOR l_prior_appr IN lc_prior_approvers
1644     LOOP
1645         FOR x IN 1..p_approval_list.COUNT
1646         LOOP
1647             IF ( p_approval_list(x) = l_prior_appr.APPROVER_ID) THEN
1648                 DELETE FROM pv_ge_temp_approvers
1649                 WHERE  arc_appr_for_entity_code = p_approval_entity
1650                 AND    appr_for_entity_id  = p_referral_id
1651                 AND    approver_id = p_approval_list(x)
1652                 AND    approval_status_code IN ('PRIOR_APPROVER');
1653             END IF;
1654         END LOOP;
1655     END LOOP;
1656 
1657 END DEL_PRIOR_REP_APPR;
1658 
1659 END PV_AME_API_W;