DBA Data[Home] [Help]

PACKAGE BODY: APPS.AME_API3

Source


1 package body ame_api3 as
2 /* $Header: ameeapi3.pkb 120.20 2011/05/17 11:38:14 nchinnam ship $ */
3   ambiguousApproverException exception;
4   ambiguousApproverMessage constant ame_util.longestStringType :=
5     ame_util.getMessage(applicationShortNameIn =>'PER',
6                        messageNameIn           => 'AME_400812_NULL_APPR_REC_NAME');
7   /* functions */
8   function getRuleDescription(ruleIdIn in varchar2) return varchar2 as
9     begin
10       return(ame_rule_pkg.getDescription(ruleIdIn => ruleIdIn));
11       exception
12         when others then
13           ame_util.runtimeException(packageNameIn => 'ame_api3',
14                                     routineNameIn => 'getRuleDescription',
15                                     exceptionNumberIn => sqlcode,
16                                     exceptionStringIn => sqlerrm);
17           raise;
18           return(null);
19     end getRuleDescription;
20   /* procedures */
21   procedure clearInsertion(applicationIdIn in number,
22                            transactionTypeIn in varchar2,
23                            transactionIdIn in varchar2,
24                            approverIn in ame_util.approverRecord2) as
25     ameAppId integer;
26     errorCode integer;
27     errorMessage ame_util.longStringType;
28     appr_rec_params varchar2(100);
29     cursor getAnchorInsertions (parameterIn varchar2) is
30       (select name
31          from ame_temp_insertions
32         where application_id = ame_engine.getAmeApplicationId
33           and transaction_id = transactionIdIn
34           and parameter = parameterIn);
35     nameList       ame_util.longStringList;
36     anchorsExistException exception;
37     cmpParameter ame_temp_insertions.parameter%type;
38     anchorName varchar2(320);
39     anchorList varchar2(1000);
40     approvers ame_util.approversTable2;
41     nullApprRecordFieldException Exception;
42     begin
43       ame_engine.lockTransaction(fndApplicationIdIn => applicationIdIn,
44                                  transactionIdIn => transactionIdIn,
45                                  transactionTypeIdIn => transactionTypeIn);
46       ameAppId := ame_admin_pkg.getApplicationId(fndAppIdIn => applicationIdIn,
47                                                  transactionTypeIdIn => transactionTypeIn);
48       appr_rec_params:=null;
49       if(approverIn.name is null) then
50         appr_rec_params := 'name ';
51       end if;
52       if approverIn.item_class is null then
53         appr_rec_params := appr_rec_params || ', item_class ';
54       end if;
55       if approverIn.item_id is null then
56         appr_rec_params := appr_rec_params || ', item_id ';
57       end if;
58       if appr_rec_params is not null then
59         raise nullApprRecordFieldException;
60       end if;
61       ame_engine.updateTransactionState(isTestTransactionIn => false,
62                                         isLocalTransactionIn => false,
63                                         fetchConfigVarsIn => true,
64                                         fetchOldApproversIn => true,
65                                         fetchInsertionsIn => true,
66                                         fetchDeletionsIn => true,
67                                         fetchAttributeValuesIn => true,
68                                         fetchInactiveAttValuesIn => false,
69                                         processProductionActionsIn => false,
70                                         processProductionRulesIn => false,
71                                         updateCurrentApproverListIn => true,
72                                         updateOldApproverListIn => true,
73                                         processPrioritiesIn => true,
74                                         prepareItemDataIn => false,
75                                         prepareRuleIdsIn => false,
76                                         prepareRuleDescsIn => false,
77                                         transactionIdIn => transactionIdIn,
78                                         ameApplicationIdIn => null,
79                                         fndApplicationIdIn => applicationIdIn,
80                                         transactionTypeIdIn => transactionTypeIn );
81       ame_engine.getApprovers(approversOut => approvers);
82       for i in 1 .. approvers.count loop
83         if approvers(i).name = approverIn.name and
84            approvers(i).item_class = approverIn.item_class and
85            approvers(i).item_id = approverIn.item_id and
86            approvers(i).api_insertion = ame_util.apiInsertion then
87           anchorName := approvers(i).name;
88           cmpParameter := approvers(i).name ||
89                           ame_util.fieldDelimiter ||
90                           approvers(i).item_class ||
91                           ame_util.fieldDelimiter ||
92                           approvers(i).item_id ||
93                           ame_util.fieldDelimiter ||
94                           approvers(i).action_type_id ||
95                           ame_util.fieldDelimiter ||
96                           approvers(i).group_or_chain_id ||
97                           ame_util.fieldDelimiter ||
98                           approvers(i).occurrence;
99           open getAnchorInsertions(cmpParameter);
100           fetch getAnchorInsertions bulk collect into nameList;
101           if nameList.count > 0 then
102             close getAnchorInsertions;
103             raise anchorsExistException;
104           end if;
105           close getAnchorInsertions;
106         end if;
107       end loop;
108       for i in 1 .. approvers.count loop
109         if approvers(i).name = approverIn.name and
110            approvers(i).item_class = approverIn.item_class and
111            approvers(i).item_id = approverIn.item_id then
112           ame_engine.updateInsertions(indexIn => i);
113         end if;
114       end loop;
115       delete from ame_temp_insertions
116         where
117           application_id = ameAppId and
118           transaction_id = transactionIdIn and
119           name = approverIn.name  and
120           item_class = approverIn.item_class and
121           item_id  = approverIn.item_id ;
122       if sql%found then
123         ame_approver_deviation_pkg.clearDeviationState(
124                         applicationIdIn  => ameAppId
125                        ,transactionIdIn => transactionIdIn );
126       end if;
127       ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
128                                    transactionIdIn => transactionIdIn,
129                                    transactionTypeIdIn => transactionTypeIn);
130     exception
131       when anchorsExistException then
132           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
133                                        transactionIdIn => transactionIdIn,
134                                        transactionTypeIdIn => transactionTypeIn);
135           anchorList := '';
136           for i in 1 .. nameList.count loop
137             anchorList := anchorList || ame_approver_type_pkg.getApproverDescription(nameList(i));
138             if i <> nameList.count then
139               anchorList := anchorList || '; ';
140             end if;
141           end loop;
142           errorCode := -20001;
143           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
144                                               messageNameIn => 'AME_400651_ANCHORS_EXIST',
145                                               tokenNameOneIn => 'APPROVER',
146                                               tokenValueOneIn => ame_approver_type_pkg.getApproverDescription(anchorName),
147                                               tokenNameTwoIn => 'ANCHORED_APPROVERS',
148                                               tokenValueTwoIn => anchorList);
149           ame_util.runtimeException(packageNameIn => 'ame_api3',
150                                     routineNameIn => 'clearInsertion',
151                                     exceptionNumberIn => errorCode,
152                                     exceptionStringIn => errorMessage);
153           raise_application_error(errorCode,
154                                   errorMessage);
155       when nullApprRecordFieldException then
156           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
157                                        transactionIdIn => transactionIdIn,
158                                        transactionTypeIdIn => transactionTypeIn);
159           errorCode := -20319;
160           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
161                                               messageNameIn          => 'AME_400813_NULL_CLINS_APPR_FLD',
162                                               tokenNameOneIn         => 'APPROVER_REC_PARAMS',
163                                               tokenValueOneIn        => appr_rec_params);
167                                     exceptionStringIn => errorMessage);
164           ame_util.runtimeException(packageNameIn => 'ame_api3',
165                                     routineNameIn => 'clearInsertion',
166                                     exceptionNumberIn => errorCode,
168           raise_application_error(errorCode,
169                                   errorMessage);
170       when others then
171           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
172                                        transactionIdIn => transactionIdIn,
173                                        transactionTypeIdIn => transactionTypeIn);
174           ame_util.runtimeException(packageNameIn => 'ame_api3',
175                                     routineNameIn => 'clearInsertion',
176                                     exceptionNumberIn => sqlcode,
177                                     exceptionStringIn => sqlerrm);
178           raise;
179   end clearInsertion;
180   procedure clearInsertions(applicationIdIn in integer,
181                             transactionTypeIn in varchar2,
182                             transactionIdIn in varchar2) as
183     ameAppId integer;
184     begin
185       ame_engine.lockTransaction(fndApplicationIdIn => applicationIdIn,
186                                  transactionIdIn => transactionIdIn,
187                                  transactionTypeIdIn => transactionTypeIn);
188       ameAppId := ame_admin_pkg.getApplicationId(fndAppIdIn => applicationIdIn,
189                                                  transactionTypeIdIn => transactionTypeIn);
190       delete from ame_temp_insertions
191         where
192           application_id = ameAppId and
193           transaction_id = transactionIdIn ;
194       if sql%found then
195         ame_approver_deviation_pkg.clearDeviationState(
196                         applicationIdIn  => ameAppId
197                        ,transactionIdIn => transactionIdIn );
198       end if;
199       ame_engine.updateTransactionState(isTestTransactionIn => false,
200                                         isLocalTransactionIn => false,
201                                         fetchConfigVarsIn => true,
202                                         fetchOldApproversIn => true,
203                                         fetchInsertionsIn => true,
204                                         fetchDeletionsIn => true,
205                                         fetchAttributeValuesIn => true,
206                                         fetchInactiveAttValuesIn => false,
207                                         processProductionActionsIn => false,
208                                         processProductionRulesIn => false,
209                                         updateCurrentApproverListIn => true,
210                                         updateOldApproverListIn => true,
211                                         processPrioritiesIn => true,
212                                         prepareItemDataIn => false,
213                                         prepareRuleIdsIn => false,
214                                         prepareRuleDescsIn => false,
215                                         transactionIdIn => transactionIdIn,
216                                         ameApplicationIdIn => null,
217                                         fndApplicationIdIn => applicationIdIn,
218                                         transactionTypeIdIn => transactionTypeIn );
219       ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
220                                    transactionIdIn => transactionIdIn,
221                                    transactionTypeIdIn => transactionTypeIn);
222     exception
223       when others then
224           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
225                                        transactionIdIn => transactionIdIn,
226                                        transactionTypeIdIn => transactionTypeIn);
227           ame_util.runtimeException(packageNameIn => 'ame_api3',
228                                     routineNameIn => 'clearInsertions',
229                                     exceptionNumberIn => sqlcode,
230                                     exceptionStringIn => sqlerrm);
231           raise;
232   end clearInsertions;
233   procedure clearSuppression(applicationIdIn in number,
234                              transactionTypeIn in varchar2,
235                              transactionIdIn in varchar2,
236                              approverIn in ame_util.approverRecord2) as
237     ameAppId integer;
238     errorCode integer;
239     errorMessage ame_util.longStringType;
240     appr_rec_params varchar2(100);
241     nullApprRecordFieldException Exception;
242     begin
243       ame_engine.lockTransaction(fndApplicationIdIn => applicationIdIn,
244                                  transactionIdIn => transactionIdIn,
245                                  transactionTypeIdIn => transactionTypeIn);
249       if(approverIn.name is null) then
246       ameAppId := ame_admin_pkg.getApplicationId(fndAppIdIn => applicationIdIn,
247                                                  transactionTypeIdIn => transactionTypeIn);
248       appr_rec_params:=null;
250         appr_rec_params := 'name ';
251       end if;
252       if approverIn.item_class is null then
253         appr_rec_params := appr_rec_params || ', item_class ';
254       end if;
255       if approverIn.item_id is null then
256         appr_rec_params := appr_rec_params || ', item_id ';
257       end if;
258       if approverIn.action_type_id is null then
259         appr_rec_params := appr_rec_params || ', action_type_id ';
260       end if;
261       if approverIn.group_or_chain_id is null then
262         appr_rec_params := appr_rec_params || ', group_or_chain_id ';
263       end if;
264       if appr_rec_params is not null then
265               raise nullApprRecordFieldException;
266       end if;
267       delete from ame_temp_deletions
268         where
269           application_id = ameAppId and
270           transaction_id = transactionIdIn and
271           name = approverIn.name  and
272           item_class = approverIn.item_class and
273           item_id  = approverIn.item_id and
274           action_type_id = approverIn.action_type_id and
275           group_or_chain_id = approverIn.group_or_chain_id ;
276       if sql%found then
277         ame_approver_deviation_pkg.clearDeviationState(
278                         applicationIdIn  => ameAppId
279                        ,transactionIdIn => transactionIdIn );
280       end if;
281       --
282       --  Cycle the engine to account for changes in the deletions table.  (There is no previous
283       -- call to initializePlsqlContext, so all of the boolean arguments need to be true.)
284       --
285       ame_engine.updateTransactionState(isTestTransactionIn => false,
286                                         isLocalTransactionIn => false,
287                                         fetchConfigVarsIn => true,
288                                         fetchOldApproversIn => true,
289                                         fetchInsertionsIn => true,
290                                         fetchDeletionsIn => true,
291                                         fetchAttributeValuesIn => true,
292                                         fetchInactiveAttValuesIn => false,
293                                         processProductionActionsIn => false,
294                                         processProductionRulesIn => false,
295                                         updateCurrentApproverListIn => true,
296                                         updateOldApproverListIn => true,
297                                         processPrioritiesIn => true,
298                                         prepareItemDataIn => false,
299                                         prepareRuleIdsIn => false,
300                                         prepareRuleDescsIn => false,
301                                         transactionIdIn => transactionIdIn,
302                                         ameApplicationIdIn => null,
303                                         fndApplicationIdIn => applicationIdIn,
304                                         transactionTypeIdIn => transactionTypeIn );
305       ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
306                                    transactionIdIn => transactionIdIn,
307                                    transactionTypeIdIn => transactionTypeIn);
308     exception
309       when nullApprRecordFieldException then
310           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
311                                      transactionIdIn => transactionIdIn,
312                                      transactionTypeIdIn => transactionTypeIn);
313           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
314                                               messageNameIn => 'AME_400814_NULL_SUPPR_APPR_FLD',
315                                               tokenNameOneIn => 'APPROVER_REC_PARAMS',
316                                               tokenvalueOneIn=>appr_rec_params);
317           errorCode := -20320;
318           ame_util.runtimeException(packageNameIn => 'ame_api3',
319                                     routineNameIn => 'clearSuppression',
320                                     exceptionNumberIn => errorCode,
321                                     exceptionStringIn => errorMessage);
322           raise_application_error(errorCode,
323                                   errorMessage);
324       when others then
325           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
326                                      transactionIdIn => transactionIdIn,
327                                      transactionTypeIdIn => transactionTypeIn);
328           ame_util.runtimeException(packageNameIn => 'ame_api3',
329                                     routineNameIn => 'clearSuppression',
330                                     exceptionNumberIn => sqlcode,
331                                     exceptionStringIn => sqlerrm);
332           raise;
333   end clearSuppression;
334   procedure clearSuppressions(applicationIdIn in integer,
335                               transactionTypeIn in varchar2,
336                               transactionIdIn in varchar2) as
337     ameAppId integer;
338     begin
339       ame_engine.lockTransaction(fndApplicationIdIn => applicationIdIn,
340                                  transactionIdIn => transactionIdIn,
341                                  transactionTypeIdIn => transactionTypeIn);
342       ameAppId := ame_admin_pkg.getApplicationId(fndAppIdIn => applicationIdIn,
343                                                  transactionTypeIdIn => transactionTypeIn);
344       delete from ame_temp_deletions
345         where
346           application_id = ameAppId and
350                         applicationIdIn  => ameAppId
347           transaction_id = transactionIdIn ;
348       if sql%found then
349         ame_approver_deviation_pkg.clearDeviationState(
351                        ,transactionIdIn => transactionIdIn );
352       end if;
353       ame_engine.updateTransactionState(isTestTransactionIn => false,
354                                         isLocalTransactionIn => false,
355                                         fetchConfigVarsIn => true,
356                                         fetchOldApproversIn => true,
357                                         fetchInsertionsIn => true,
358                                         fetchDeletionsIn => true,
359                                         fetchAttributeValuesIn => true,
360                                         fetchInactiveAttValuesIn => false,
361                                         processProductionActionsIn => false,
362                                         processProductionRulesIn => false,
363                                         updateCurrentApproverListIn => true,
364                                         updateOldApproverListIn => true,
365                                         processPrioritiesIn => true,
366                                         prepareItemDataIn => false,
367                                         prepareRuleIdsIn => false,
368                                         prepareRuleDescsIn => false,
369                                         transactionIdIn => transactionIdIn,
370                                         ameApplicationIdIn => null,
371                                         fndApplicationIdIn => applicationIdIn,
372                                         transactionTypeIdIn => transactionTypeIn );
373       ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
374                                    transactionIdIn => transactionIdIn,
375                                    transactionTypeIdIn => transactionTypeIn);
376     exception
377       when others then
378         ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
379                                      transactionIdIn => transactionIdIn,
380                                      transactionTypeIdIn => transactionTypeIn);
381           ame_util.runtimeException(packageNameIn => 'ame_api3',
382                                     routineNameIn => 'clearSuppressions',
383                                     exceptionNumberIn => sqlcode,
384                                     exceptionStringIn => sqlerrm);
385           raise;
386   end clearSuppressions;
387   procedure getAllApprovalGroups(groupIdsOut out nocopy ame_util.idList,
388                                  groupNamesOut out nocopy ame_util.stringList)  as
389     cursor fetchGroupsCursor is
390       select approval_group_id, name
391         from ame_approval_groups
392         where end_date is null
393         order by name;
394     begin
395       open fetchGroupsCursor;
396       fetch fetchGroupsCursor bulk collect
397         into
398           groupIdsOut,
399           groupNamesOut;
400       close fetchGroupsCursor;
401     exception
402       when others then
403         ame_util.runtimeException(packageNameIn => 'ame_api3',
404                                     routineNameIn => 'getAllApprovalGroups',
405                                     exceptionNumberIn => sqlcode,
406                                     exceptionStringIn => sqlerrm);
407         raise;
408   end getAllApprovalGroups;
409   procedure getApplicableRules1(applicationIdIn in integer,
410                                 transactionIdIn in varchar2,
411                                 transactionTypeIn in varchar2,
412                                 ruleIdsOut out nocopy ame_util.idList) as
413     ruleDescriptions ame_util.stringList;
414     productionFunctionality ame_util.stringType;
415     processProductionRules boolean;
416     begin
417       productionFunctionality := ame_util.getConfigVar
418         (variableNameIn    => ame_util.productionConfigVar
419         ,applicationIdIn   => ame_admin_pkg.getApplicationId
420            (fndAppIdIn            => applicationIdIn
421            ,transactionTypeIdIn   => transactionTypeIn
422            )
423         );
424       if productionFunctionality in (ame_util.noProductions, ame_util.perApproverProductions) then
425         processProductionRules := false;
426       else
427         processProductionRules := true;
428       end if;
429       ame_engine.updateTransactionState(isTestTransactionIn => false,
430                                         isLocalTransactionIn => false,
431                                         fetchConfigVarsIn => true,
432                                         fetchOldApproversIn => true,
433                                         fetchInsertionsIn => true,
434                                         fetchDeletionsIn => true,
435                                         fetchAttributeValuesIn => true,
436                                         fetchInactiveAttValuesIn => false,
437                                         processProductionActionsIn => false,
438                                         processProductionRulesIn => processProductionRules,
439                                         updateCurrentApproverListIn => true,
440                                         updateOldApproverListIn => true,
441                                         processPrioritiesIn => true,
442                                         prepareItemDataIn => false,
443                                         prepareRuleIdsIn => true,
444                                         prepareRuleDescsIn => false,
445                                         transactionIdIn => transactionIdIn,
446                                         ameApplicationIdIn => null,
447                                         fndApplicationIdIn => applicationIdIn,
451         ,ruleDescriptionsOut => ruleDescriptions);
448                                         transactionTypeIdIn => transactionTypeIn );
449       ame_engine.getApplicableRules
450         (ruleIdsOut          => ruleIdsOut
452     exception
453         when others then
454           ame_util.runtimeException(packageNameIn => 'ame_api3',
455                                     routineNameIn => 'getApplicableRules1',
456                                     exceptionNumberIn => sqlcode,
457                                     exceptionStringIn => sqlerrm);
458           raise;
459     end getApplicableRules1;
460   procedure getApplicableRules2(applicationIdIn in integer,
461                                 transactionIdIn in varchar2,
462                                 transactionTypeIn in varchar2,
463                                 ruleDescriptionsOut out nocopy ame_util.stringList) as
464     ruleIds ame_util.idList;
465     productionFunctionality ame_util.stringType;
466     processProductionRules boolean;
467     begin
468       productionFunctionality := ame_util.getConfigVar
469         (variableNameIn    => ame_util.productionConfigVar
470         ,applicationIdIn   => ame_admin_pkg.getApplicationId
471            (fndAppIdIn            => applicationIdIn
472            ,transactionTypeIdIn   => transactionTypeIn
473            )
474         );
475       if productionFunctionality in (ame_util.noProductions, ame_util.perApproverProductions) then
476         processProductionRules := false;
477       else
478         processProductionRules := true;
479       end if;
480       ame_engine.updateTransactionState(isTestTransactionIn => false,
481                                         isLocalTransactionIn => false,
482                                         fetchConfigVarsIn => true,
483                                         fetchOldApproversIn => true,
484                                         fetchInsertionsIn => true,
485                                         fetchDeletionsIn => true,
486                                         fetchAttributeValuesIn => true,
487                                         fetchInactiveAttValuesIn => false,
488                                         processProductionActionsIn => false,
489                                         processProductionRulesIn => processProductionRules,
490                                         updateCurrentApproverListIn => true,
491                                         updateOldApproverListIn => true,
492                                         processPrioritiesIn => true,
493                                         prepareItemDataIn => false,
494                                         prepareRuleIdsIn => true,
495                                         prepareRuleDescsIn => true,
496                                         transactionIdIn => transactionIdIn,
497                                         ameApplicationIdIn => null,
498                                         fndApplicationIdIn => applicationIdIn,
499                                         transactionTypeIdIn => transactionTypeIn );
500       ame_engine.getApplicableRules
501         (ruleIdsOut          => ruleIds
502         ,ruleDescriptionsOut => ruleDescriptionsOut);
503     exception
504         when others then
505           ame_util.runtimeException(packageNameIn => 'ame_api3',
506                                     routineNameIn => 'getApplicableRules2',
507                                     exceptionNumberIn => sqlcode,
508                                     exceptionStringIn => sqlerrm);
509           raise;
510   end getApplicableRules2;
511   procedure getApplicableRules3(applicationIdIn in integer,
512                                 transactionIdIn in varchar2,
513                                 transactionTypeIn in varchar2,
514                                 ruleIdsOut out nocopy ame_util.idList,
515                                 ruleDescriptionsOut out nocopy ame_util.stringList) as
516     productionFunctionality ame_util.stringType;
517     processProductionRules boolean;
518     begin
519       productionFunctionality := ame_util.getConfigVar
520         (variableNameIn    => ame_util.productionConfigVar
521         ,applicationIdIn   => ame_admin_pkg.getApplicationId
522            (fndAppIdIn            => applicationIdIn
523            ,transactionTypeIdIn   => transactionTypeIn
524            )
525         );
526       if productionFunctionality in (ame_util.noProductions, ame_util.perApproverProductions) then
527         processProductionRules := false;
528       else
529         processProductionRules := true;
530       end if;
531       ame_engine.updateTransactionState(isTestTransactionIn => false,
532                                         isLocalTransactionIn => false,
533                                         fetchConfigVarsIn => true,
534                                         fetchOldApproversIn => true,
535                                         fetchInsertionsIn => true,
536                                         fetchDeletionsIn => true,
537                                         fetchAttributeValuesIn => true,
538                                         fetchInactiveAttValuesIn => false,
539                                         processProductionActionsIn => false,
540                                         processProductionRulesIn => processProductionRules,
541                                         updateCurrentApproverListIn => true,
542                                         updateOldApproverListIn => true,
543                                         processPrioritiesIn => true,
544                                         prepareItemDataIn => false,
545                                         prepareRuleIdsIn => true,
546                                         prepareRuleDescsIn => true,
547                                         transactionIdIn => transactionIdIn,
548                                         ameApplicationIdIn => null,
552         (ruleIdsOut          => ruleIdsOut
549                                         fndApplicationIdIn => applicationIdIn,
550                                         transactionTypeIdIn => transactionTypeIn);
551       ame_engine.getApplicableRules
553         ,ruleDescriptionsOut => ruleDescriptionsOut);
554     exception
555         when others then
556           ame_util.runtimeException(packageNameIn => 'ame_api3',
557                                     routineNameIn => 'getApplicableRules3',
558                                     exceptionNumberIn => sqlcode,
559                                     exceptionStringIn => sqlerrm);
560           raise;
561   end getApplicableRules3;
562   procedure getApprovalGroupId(groupNameIn ame_util.stringType,
563                                groupIdOut out nocopy number)  as
564     errorCode integer;
565     errorMessage ame_util.longestStringType;
566     begin
567       select approval_group_id
568         into groupIdOut
569         from ame_approval_groups
570         where name = groupNameIn
571           and end_date is null;
572     exception
573       when no_data_found then
574           errorCode := -20001;
575           errorMessage := ame_util.getMessage(
576                            applicationShortNameIn => 'PER',
577                            messageNameIn   => 'AME_400453_GROUP_NOT_DEFINED',
578                            tokenNameOneIn  => 'APPROVAL_GROUP',
579                            tokenValueOneIn => groupNameIn);
580           ame_util.runtimeException(packageNameIn => 'ame_api3',
581                                     routineNameIn => 'getApprovalGroupId',
582                                     exceptionNumberIn => errorCode,
583                                     exceptionStringIn => errorMessage);
584           raise_application_error(errorCode,
585                                   errorMessage);
586       when others then
587         ame_util.runtimeException(packageNameIn => 'ame_api3',
588                                     routineNameIn => 'getApprovalGroupId',
589                                     exceptionNumberIn => sqlcode,
590                                     exceptionStringIn => sqlerrm);
591         raise;
592   end getApprovalGroupId;
593   procedure getAttributeValue( applicationIdIn in number,
594                                transactionTypeIn in varchar2,
595                                transactionIdIn in varchar2,
596                                attributeNameIn in varchar2,
597                                itemIdIn in varchar2,
598                                attributeValue1Out out nocopy varchar2,
599                                attributeValue2Out out nocopy varchar2,
600                                attributeValue3Out out nocopy varchar2) as
601     itemId ame_util.stringType;
602     begin
603       ame_engine.updateTransactionState(isTestTransactionIn => false,
604                                         isLocalTransactionIn => false,
605                                         fetchConfigVarsIn => false,
606                                         fetchOldApproversIn => false,
607                                         fetchInsertionsIn => false,
608                                         fetchDeletionsIn => false,
609                                         fetchAttributeValuesIn => true,
610                                         fetchInactiveAttValuesIn => true,
611                                         processProductionActionsIn => false,
612                                         processProductionRulesIn => false,
613                                         updateCurrentApproverListIn => false,
614                                         updateOldApproverListIn => false,
615                                         processPrioritiesIn => false,
616                                         prepareItemDataIn => false,
617                                         prepareRuleIdsIn => false,
618                                         prepareRuleDescsIn => false,
619                                         transactionIdIn => transactionIdIn,
620                                         ameApplicationIdIn => null,
621                                         fndApplicationIdIn => applicationIdIn,
622                                         transactionTypeIdIn => transactionTypeIn );
623       /* In case no itemId is passed in, assume it belongs to the header itemClass and
624          pass in the transactionIdIn */
625       if itemIdIn is null then
626         itemId := transactionIdIn;
627       else
628         itemId := itemIdIn;
629       end if;
630       ame_engine.getItemAttValues2(attributeNameIn => attributeNameIn,
631                                    itemIdIn => itemId,
632                                    attributeValue1Out => attributeValue1Out,
633                                    attributeValue2Out => attributeValue2Out,
634                                    attributeValue3Out => attributeValue3Out);
635     exception
636         when others then
637           ame_util.runtimeException(packageNameIn => 'ame_api3',
638                                     routineNameIn => 'getAttributeValue',
639                                     exceptionNumberIn => sqlcode,
640                                     exceptionStringIn => sqlerrm);
641           raise;
642     end getAttributeValue;
643    /*
644     getAvailableInsertions limits its output to insertions available for the order type orderTypeIn,
645     if this is null; otherwise getAvailableInsertions outputs insertions available for all order types.
646     Chain-of-authority insertees (those having authority = ame_util.authorityApprover and
647     api_insertion = ame_util.apiAuthorityInsertion) must have the approver_category value
648     ame_util.approvalApproverCategory.  Ad-hoc insertees may be of either approver category.
649   */
650   procedure getAvailableInsertions(applicationIdIn in number,
654                                    orderTypeIn in varchar2 default null,
651                                    transactionTypeIn in varchar2,
652                                    transactionIdIn in varchar2,
653                                    positionIn in number,
655                                    availableInsertionsOut out nocopy ame_util.insertionsTable2) as
656     begin
657       ame_engine.updateTransactionState(isTestTransactionIn => false,
658                                         isLocalTransactionIn => false,
659                                         fetchConfigVarsIn => true,
660                                         fetchOldApproversIn => true,
661                                         fetchInsertionsIn => true,
662                                         fetchDeletionsIn => true,
663                                         fetchAttributeValuesIn => true,
664                                         fetchInactiveAttValuesIn => false,
665                                         processProductionActionsIn => false,
666                                         processProductionRulesIn => false,
667                                         updateCurrentApproverListIn => true,
668                                         updateOldApproverListIn => false,
669                                         processPrioritiesIn => true,
670                                         prepareItemDataIn => false,
671                                         prepareRuleIdsIn => false,
672                                         prepareRuleDescsIn => false,
673                                         transactionIdIn => transactionIdIn,
674                                         ameApplicationIdIn => null,
675                                         fndApplicationIdIn => applicationIdIn,
676                                         transactionTypeIdIn => transactionTypeIn );
677 
678       ame_engine.getInsertions
679         (positionIn               => positionIn
680         ,coaInsertionsYNIn        => ame_util.booleanTrue
681         ,orderTypeIn              => orderTypeIn
682         ,availableInsertionsOut   => availableInsertionsOut
683         );
684     exception
685       when others then
686         ame_util.runtimeException
687           (packageNameIn      => 'ame_api3'
688           ,routineNameIn      => 'getAvailableInsertions'
689           ,exceptionNumberIn  => sqlcode
690           ,exceptionStringIn  => sqlerrm
691           );
692       raise;
693   end getAvailableInsertions;
694   procedure getConditionDetails(conditionIdIn in integer,
695                                 attributeNameOut out nocopy varchar2,
696                                 attributeTypeOut out nocopy varchar2,
697                                 attributeDescriptionOut out nocopy varchar2,
698                                 lowerLimitOut out nocopy varchar2,
699                                 upperLimitOut out nocopy varchar2,
700                                 includeLowerLimitOut out nocopy varchar2,
701                                 includeUpperLimitOut out nocopy varchar2,
702                                 currencyCodeOut out nocopy varchar2,
703                                 allowedValuesOut out nocopy ame_util.longestStringList) as
704     begin
705       select
706         ame_attributes.name,
707         ame_attributes.attribute_type,
708         ame_attributes.description,
709         ame_conditions.parameter_one,
710         ame_conditions.parameter_two,
711         ame_conditions.include_lower_limit,
712         ame_conditions.include_upper_limit,
713         ame_conditions.parameter_three
714         into
715           attributeNameOut,
716           attributeTypeOut,
717           attributeDescriptionOut,
718           lowerLimitOut,
719           upperLimitOut,
720           includeLowerLimitOut,
721           includeUpperLimitOut,
722           currencyCodeOut
723         from
724           ame_attributes,
725           ame_conditions
726         where
727           ame_attributes.attribute_id = ame_conditions.attribute_id and
728           ame_conditions.condition_id = conditionIdIn and
729           sysdate between
730             ame_attributes.start_date and
731             nvl(ame_attributes.end_date - ame_util.oneSecond, sysdate) and
732           sysdate between
733             ame_conditions.start_date and
734             nvl(ame_conditions.end_date - ame_util.oneSecond, sysdate);
735       if(attributeTypeOut = ame_util.stringAttributeType) then
736         ame_condition_pkg.getStringValueList(conditionIdIn => conditionIdIn,
737                                              stringValueListOut => allowedValuesOut);
738       end if;
739     exception
740       when others then
741         ame_util.runtimeException(packageNameIn => 'ame_api3',
742                                   routineNameIn => 'getConditionDetails',
743                                   exceptionNumberIn => sqlcode,
744                                   exceptionStringIn => sqlerrm);
745         raise;
746     end getConditionDetails;
747   procedure getGroupMembers1(applicationIdIn in number default null,
748                              transactionTypeIn in varchar2 default null,
749                              transactionIdIn in varchar2 default null,
750                              groupIdIn in number,
751                              memberDisplayNamesOut out nocopy ame_util.longStringList)as
752       cursor groupMemberCursor(groupIdIn in integer) is
753         select
754           parameter,
755           upper(parameter_name),
756           query_string,
757           orig_system,
758           orig_system_id
759           from ame_approval_group_members
760           where
761             approval_group_id = groupIdIn
762           order by order_number;
763       badDynamicMemberException exception;
764       noItemBindException exception;
765       dynamicCursor integer;
766       colonLocation1 integer;
767       colonLocation2 integer;
768       displayNames ame_util.longStringList;
769       errorCode integer;
770       errorMessage ame_util.longestStringType;
771       noTransIdDefinedException exception;
772       orderNumbers ame_util.idList;
773       l_orig_systemList ame_util.stringList;
774       l_orig_system_id ame_util.idList;
775       memberOrigSystem ame_util.stringType;
776       memberOrigSystemId number;
777       outputIndex integer;
778       parameters ame_util.longStringList;
779       queryStrings ame_util.longestStringList;
780       rowsFound integer;
781       tempGroupMembers dbms_sql.Varchar2_Table;
782       upperParameterNames ame_util.stringList;
783       tempGroupName       ame_util.stringType;
784       l_error_code number;
785       begin
786         open groupMemberCursor(groupIdIn => groupIdIn);
787         fetch groupMemberCursor bulk collect
788           into
789             parameters,
790             upperParameterNames,
791             queryStrings,
792             l_orig_systemList,
793             l_orig_system_id;
794         close groupMemberCursor;
795         outputIndex := 0; /* pre-increment */
796         for i in 1 .. parameters.count loop
797           if(upperParameterNames(i) = upper(ame_util.approverOamGroupId)) then
798             dynamicCursor := dbms_sql.open_cursor;
799             dbms_sql.parse(dynamicCursor,
800                            ame_util.removeReturns(stringIn => queryStrings(i),
801                                                   replaceWithSpaces => true),
802                            dbms_sql.native);
803             if(instrb(queryStrings(i),
804                       ame_util.transactionIdPlaceholder) > 0) then
805               if transactionIdIn is null then
806                  dbms_sql.close_cursor(dynamicCursor);
807                  raise noTransIdDefinedException;
808               end if;
809               dbms_sql.bind_variable(dynamicCursor,
810                                      ame_util.transactionIdPlaceholder,
811                                      transactionIdIn,
812                                      50);
813             end if;
814             if(instrb(queryStrings(i),ame_util2.itemClassPlaceHolder) > 0) or
815                (instrb(queryStrings(i),ame_util2.itemIdPlaceHolder) > 0) then
816               dbms_sql.close_cursor(dynamicCursor);
817               raise noItemBindException;
818             end if;
819             dbms_sql.define_array(dynamicCursor,
820                                   1,
821                                   tempGroupMembers,
822                                   100,
823                                   1);
824             rowsFound := dbms_sql.execute(dynamicCursor);
825             loop
826               rowsFound := dbms_sql.fetch_rows(dynamicCursor);
827               dbms_sql.column_value(dynamicCursor,
828                                     1,
829                                     tempGroupMembers);
830               exit when rowsFound < 100;
831             end loop;
832             dbms_sql.close_cursor(dynamicCursor);
833             /*
834               Dynamic groups' query strings may return rows having one of two forms:
835                 (1) approver_type:approver_id
836                 (2) orig_system:orig_system_id:approver_name
837             */
838             for j in 1 .. tempGroupMembers.count loop
839               colonLocation1 := instrb(tempGroupMembers(j), ':', 1, 1);
840               colonLocation2 := instrb(tempGroupMembers(j), ':', 1, 2);
841               if(colonLocation1 = 0) then
842                 raise badDynamicMemberException;
843               end if;
844               outputIndex := outputIndex + 1;
845               if(colonLocation2 = 0) then /* first case (old style) */
846                 memberOrigSystemId :=
847                   substrb(tempGroupMembers(j), (instrb(tempGroupMembers(j), ':', 1, 1) + 1));
848                 if(substrb(upper(tempGroupMembers(j)), 1, (instrb(tempGroupMembers(j), ':', 1, 1) - 1)) =
849                    upper(ame_util.approverPersonId)) then
850                   memberOrigSystem := ame_util.perOrigSystem;
851                 elsif (substrb(upper(tempGroupMembers(j)), 1, (instrb(tempGroupMembers(j), ':', 1, 1) - 1)) =
852                    upper(ame_util.approverUserId)) then
853                   memberOrigSystem := ame_util.fndUserOrigSystem;
854                 else
855                   memberOrigSystem :=
856                    substrb(tempGroupMembers(j), 1, (instrb(tempGroupMembers(j), ':', 1, 1)-1));
857                   memberOrigSystemId :=
858                    substrb(tempGroupMembers(j),instrb(tempGroupMembers(j), ':', 1, 1) + 1);
859                 end if;
860               else
861                 memberOrigSystem :=
862                   substrb(tempGroupMembers(j), 1, (instrb(tempGroupMembers(j), ':', 1, 1)-1));
863                 memberOrigSystemId :=
864                   substrb(tempGroupMembers(j), (instrb(tempGroupMembers(j), ':', 1, 1)+1),
865                     (instrb(tempGroupMembers(j), ':', 1, 2)-1));
866               end if;
867               begin
868                 memberDisplayNamesOut(outputIndex) :=
869                         ame_approver_type_pkg.getApproverDisplayName2(
870                                         origSystemIn => memberOrigSystem,
871                                         origSystemIdIn => memberOrigSystemId);
872               exception
873                 when others then
874                   l_error_code := sqlcode;
875                   if l_error_code = -20213 then
876                     errorCode := -20223;
877                     errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
878                                                  messageNameIn => 'AME_400838_INV_APR_FOUND',
879                                                  tokenNameOneIn  => 'PROCESS_NAME',
880                                                  tokenValueOneIn => 'ame_api3.getGroupMembers1',
881                                                  tokenNameTwoIn => 'ORIG_SYSTEM',
882                                                  tokenValueTwoIn => memberOrigSystem,
883                                                  tokenNameThreeIn => 'ORIG_SYSEM_ID',
884                                                  tokenValueThreeIn => memberOrigSystemId);
885                     raise_application_error(errorCode,errorMessage);
886                   end if;
887                   raise;
888               end;
889             end loop;
890           else /* Copy the static group into the engGroup caches. */
891             outputIndex := outputIndex + 1;
892             begin
893              displayNames(i) := ame_approver_type_pkg.getApproverDisplayName2(l_orig_systemList(i), l_orig_system_id(i));
894             exception
895               when others then
896                l_error_code := sqlcode;
897                if l_error_code = -20213 then
898                  errorCode := -20223;
899                  errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
900                                               messageNameIn => 'AME_400838_INV_APR_FOUND',
901                                               tokenNameOneIn  => 'PROCESS_NAME',
902                                               tokenValueOneIn => 'ame_api3.getGroupMembers1',
903                                               tokenNameTwoIn => 'ORIG_SYSTEM',
904                                               tokenValueTwoIn => l_orig_systemList(i),
905                                               tokenNameThreeIn => 'ORIG_SYSEM_ID',
906                                               tokenValueThreeIn => l_orig_system_id(i));
907                  raise_application_error(errorCode,errorMessage);
908                end if;
909                raise;
910             end;
911             memberDisplayNamesOut(outputIndex) := displayNames(i);
912           end if;
913         end loop;
914       exception
915         when badDynamicMemberException then
916           if(groupMemberCursor%isopen) then
917             close groupMemberCursor;
918           end if;
919           memberDisplayNamesOut.delete;
920           errorCode := -20315;
921           errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
922                                       messageNameIn => 'AME_400454_GRP_DYN_QRY_ERR');
923           ame_util.runtimeException(packageNameIn => 'ame_api3',
924                                     routineNameIn => 'getGroupMembers1',
925                                     exceptionNumberIn => errorCode,
926                                     exceptionStringIn => errorMessage);
927           raise_application_error(errorCode,
928                                   errorMessage);
929         when noItemBindException then
930           if(groupMemberCursor%isopen) then
931             close groupMemberCursor;
932           end if;
933           memberDisplayNamesOut.delete;
934           errorCode := -20316;
935           ame_api5.getApprovalGroupName(groupIdIn    => groupIdIn
936                                        ,groupNameOut => tempGroupName);
937           errorMessage := ame_util.getMessage(
938                            applicationShortNameIn => 'PER',
939                            messageNameIn   => 'AME_400798_GROUP_ITEM_BIND',
940                            tokenNameOneIn  => 'APPROVER_GROUP',
941                            tokenValueOneIn => tempGroupName);
942           ame_util.runtimeException(packageNameIn => 'ame_api3',
943                                     routineNameIn => 'getGroupMembers1',
944                                     exceptionNumberIn => errorCode,
945                                     exceptionStringIn => errorMessage);
946           raise_application_error(errorCode,
947                                   errorMessage);
948         when noTransIdDefinedException then
949           if(groupMemberCursor%isopen) then
950             close groupMemberCursor;
951           end if;
952           memberDisplayNamesOut.delete;
953           errorCode := -20001;
954           ame_api5.getApprovalGroupName(groupIdIn    => groupIdIn
955                                        ,groupNameOut => tempGroupName);
956           errorMessage := ame_util.getMessage(
957                            applicationShortNameIn => 'PER',
958                            messageNameIn   => 'AME_400455_GRP_DYN_NULL_TXID',
959                            tokenNameOneIn  => 'APPROVAL_GROUP',
960                            tokenValueOneIn => tempGroupName);
961           ame_util.runtimeException(packageNameIn => 'ame_api3',
962                                     routineNameIn => 'getGroupMembers1',
963                                     exceptionNumberIn => errorCode,
964                                     exceptionStringIn => errorMessage);
965           raise_application_error(errorCode,
966                                   errorMessage);
967         when others then
968           if(groupMemberCursor%isopen) then
969             close groupMemberCursor;
970           end if;
971           memberDisplayNamesOut.delete;
972           ame_util.runtimeException(packageNameIn => 'ame_api3',
973                                     routineNameIn => 'getGroupMembers1',
974                                     exceptionNumberIn => sqlcode,
975                                     exceptionStringIn => sqlerrm);
976           raise;
977   end getGroupMembers1;
978   procedure getGroupMembers2(applicationIdIn in number default null,
979                              transactionTypeIn in varchar2 default null,
980                              transactionIdIn in varchar2 default null,
981                              groupIdIn in number,
982                              memberNamesOut out nocopy ame_util.longStringList,
983                              memberDisplayNamesOut out nocopy ame_util.longStringList)as
984       cursor groupMemberCursor(groupIdIn in integer) is
985         select
986           parameter,
987           upper(parameter_name),
988           query_string,
989           orig_system,
990           orig_system_id
991           from ame_approval_group_members
992           where
993             approval_group_id = groupIdIn
994           order by order_number;
995       badDynamicMemberException exception;
996       noItemBindException exception;
997       dynamicCursor integer;
998       colonLocation1 integer;
999       colonLocation2 integer;
1000       displayNames ame_util.longStringList;
1001       errorCode integer;
1002       errorMessage ame_util.longestStringType;
1003       approverNames ame_util.longStringList;
1004       orig_systemList ame_util.stringList;
1005       orig_system_idList ame_util.idList;
1006       memberOrigSystem ame_util.stringType;
1007       memberOrigSystemId number;
1008       noTransIdDefinedException exception;
1009       orderNumbers ame_util.idList;
1010       origSystemIds ame_util.idList;
1011       origSystems ame_util.stringList;
1012       outputIndex integer;
1013       parameters ame_util.longStringList;
1014       queryStrings ame_util.longestStringList;
1015       rowsFound integer;
1016       tempGroupMembers dbms_sql.Varchar2_Table;
1017       upperParameterNames ame_util.stringList;
1018       tempGroupName       ame_util.stringType;
1019       l_error_code number;
1020       begin
1021         open groupMemberCursor(groupIdIn => groupIdIn);
1022         fetch groupMemberCursor bulk collect
1023           into
1024             parameters,
1025             upperParameterNames,
1026             queryStrings,
1027             orig_systemList,
1028             orig_system_idList;
1029         close groupMemberCursor;
1030         outputIndex := 0; /* pre-increment */
1031         for i in 1 .. parameters.count loop
1032           if(upperParameterNames(i) = upper(ame_util.approverOamGroupId)) then
1033             dynamicCursor := dbms_sql.open_cursor;
1034             dbms_sql.parse(dynamicCursor,
1035                            ame_util.removeReturns(stringIn => queryStrings(i),
1036                                                   replaceWithSpaces => true),
1037                            dbms_sql.native);
1038             if(instrb(queryStrings(i),
1039                       ame_util.transactionIdPlaceholder) > 0) then
1040               if transactionIdIn is null then
1041                  dbms_sql.close_cursor(dynamicCursor);
1042                  raise noTransIdDefinedException;
1043               end if;
1044               dbms_sql.bind_variable(dynamicCursor,
1045                                      ame_util.transactionIdPlaceholder,
1046                                      transactionIdIn,
1047                                      50);
1048             end if;
1049             if(instrb(queryStrings(i),ame_util2.itemClassPlaceHolder) > 0) or
1050                (instrb(queryStrings(i),ame_util2.itemIdPlaceHolder) > 0) then
1051               dbms_sql.close_cursor(dynamicCursor);
1052               raise noItemBindException;
1053             end if;
1054             dbms_sql.define_array(dynamicCursor,
1055                                   1,
1056                                   tempGroupMembers,
1057                                   100,
1058                                   1);
1059             rowsFound := dbms_sql.execute(dynamicCursor);
1060             loop
1061               rowsFound := dbms_sql.fetch_rows(dynamicCursor);
1062               dbms_sql.column_value(dynamicCursor,
1063                                     1,
1064                                     tempGroupMembers);
1065               exit when rowsFound < 100;
1066             end loop;
1067             dbms_sql.close_cursor(dynamicCursor);
1068             /*
1069               Dynamic groups' query strings may return rows having one of two forms:
1070                 (1) approver_type:approver_id
1071                 (2) orig_system:orig_system_id:approver_name
1072             */
1073             for j in 1 .. tempGroupMembers.count loop
1074               colonLocation1 := instrb(tempGroupMembers(j), ':', 1, 1);
1075               colonLocation2 := instrb(tempGroupMembers(j), ':', 1, 2);
1076               if(colonLocation1 = 0) then
1077                 raise badDynamicMemberException;
1078               end if;
1079               outputIndex := outputIndex + 1;
1080               if(colonLocation2 = 0) then /* first case (old style) */
1081                 memberOrigSystemId :=
1082                   substrb(tempGroupMembers(j), (instrb(tempGroupMembers(j), ':', 1, 1) + 1));
1083                 if(substrb(upper(tempGroupMembers(j)), 1, (instrb(tempGroupMembers(j), ':', 1, 1) - 1)) =
1084                    upper(ame_util.approverPersonId)) then
1085                   memberOrigSystem := ame_util.perOrigSystem;
1086                 elsif (substrb(upper(tempGroupMembers(j)), 1, (instrb(tempGroupMembers(j), ':', 1, 1) - 1)) =
1087                    upper(ame_util.approverUserId)) then
1088                   memberOrigSystem := ame_util.fndUserOrigSystem;
1089                 else
1090                   memberOrigSystem :=
1091                    substrb(tempGroupMembers(j), 1, (instrb(tempGroupMembers(j), ':', 1, 1)-1));
1092                   memberOrigSystemId :=
1093                    substrb(tempGroupMembers(j),instrb(tempGroupMembers(j), ':', 1, 1) + 1);
1094                 end if;
1095               else
1096                 memberOrigSystem :=
1097                   substrb(tempGroupMembers(j), 1, (instrb(tempGroupMembers(j), ':', 1, 1)-1));
1098                 memberOrigSystemId :=
1099                   substrb(tempGroupMembers(j), (instrb(tempGroupMembers(j), ':', 1, 1)+1),
1100                     (instrb(tempGroupMembers(j), ':', 1, 2)-1));
1101               end if;
1102 
1103               begin
1104                 ame_approver_type_pkg.getWfRolesNameAndDisplayName(
1105                   origSystemIn => memberOrigSystem,
1106                   origSystemIdIn => memberOrigSystemId,
1107                   nameOut => memberNamesOut(outputIndex),
1108                   displayNameOut => memberDisplayNamesOut(outputIndex));
1109               exception
1110                when others then
1111                  l_error_code := sqlcode;
1112                  if l_error_code = -20213 then
1113                  errorCode := -20223;
1114                  errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
1115                                                 messageNameIn => 'AME_400838_INV_APR_FOUND',
1116                                                 tokenNameOneIn  => 'PROCESS_NAME',
1117                                                 tokenValueOneIn => 'ame_api3.getGroupMembers2',
1118                                                 tokenNameTwoIn => 'ORIG_SYSTEM',
1119                                                 tokenValueTwoIn => memberOrigSystem,
1120                                                 tokenNameThreeIn => 'ORIG_SYSEM_ID',
1121                                                 tokenValueThreeIn => memberOrigSystemId);
1122                  raise_application_error(errorCode,errorMessage);
1123                  end if;
1124                  raise;
1125               end;
1126             end loop;
1127           else /* Copy the static group into the engGroup caches. */
1131                 origSystemIn => orig_systemList(i),
1128             outputIndex := outputIndex + 1;
1129             begin
1130               ame_approver_type_pkg.getWfRolesNameAndDisplayName(
1132                 origSystemIdIn => orig_system_idList(i),
1133                 nameOut => memberNamesOut(outputIndex),
1134                 displayNameOut => memberDisplayNamesOut(outputIndex));
1135             exception
1136              when others then
1137                l_error_code := sqlcode;
1138                if l_error_code = -20213 then
1139                errorCode := -20223;
1140                errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
1141                                               messageNameIn => 'AME_400838_INV_APR_FOUND',
1142                                               tokenNameOneIn  => 'PROCESS_NAME',
1143                                               tokenValueOneIn => 'ame_api3.getGroupMembers2',
1144                                               tokenNameTwoIn => 'ORIG_SYSTEM',
1145                                               tokenValueTwoIn => orig_systemList(i),
1146                                               tokenNameThreeIn => 'ORIG_SYSEM_ID',
1147                                               tokenValueThreeIn => orig_system_idList(i));
1148                raise_application_error(errorCode,errorMessage);
1149                end if;
1150                raise;
1151             end;
1152           end if;
1153         end loop;
1154       exception
1155         when badDynamicMemberException then
1156           if(groupMemberCursor%isopen) then
1157             close groupMemberCursor;
1158           end if;
1159           errorCode := -20315;
1160           errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
1161                                       messageNameIn => 'AME_400454_GRP_DYN_QRY_ERR');
1162           ame_util.runtimeException(packageNameIn => 'ame_api3',
1163                                     routineNameIn => 'getGroupMembers2',
1164                                     exceptionNumberIn => errorCode,
1165                                     exceptionStringIn => errorMessage);
1166           raise_application_error(errorCode,
1167                                   errorMessage);
1168         when noTransIdDefinedException then
1169           if(groupMemberCursor%isopen) then
1170             close groupMemberCursor;
1171           end if;
1172           errorCode := -20001;
1173           ame_api5.getApprovalGroupName(groupIdIn    => groupIdIn
1174                                        ,groupNameOut => tempGroupName);
1175           errorMessage := ame_util.getMessage(
1176                            applicationShortNameIn => 'PER',
1177                            messageNameIn   => 'AME_400455_GRP_DYN_NULL_TXID',
1178                            tokenNameOneIn  => 'APPROVAL_GROUP',
1179                            tokenValueOneIn => tempGroupName);
1180           ame_util.runtimeException(packageNameIn => 'ame_api3',
1181                                     routineNameIn => 'getGroupMembers2',
1182                                     exceptionNumberIn => errorCode,
1183                                     exceptionStringIn => errorMessage);
1184           raise_application_error(errorCode,
1185                                   errorMessage);
1186        when noItemBindException then
1187           if(groupMemberCursor%isopen) then
1188             close groupMemberCursor;
1189           end if;
1190           memberDisplayNamesOut.delete;
1191           errorCode := -20316;
1192           ame_api5.getApprovalGroupName(groupIdIn    => groupIdIn
1193                                        ,groupNameOut => tempGroupName);
1194           errorMessage := ame_util.getMessage(
1195                            applicationShortNameIn => 'PER',
1196                            messageNameIn   => 'AME_400798_GROUP_ITEM_BIND',
1197                            tokenNameOneIn  => 'APPROVER_GROUP',
1198                            tokenValueOneIn => tempGroupName);
1199           ame_util.runtimeException(packageNameIn => 'ame_api3',
1200                                     routineNameIn => 'getGroupMembers2',
1201                                     exceptionNumberIn => errorCode,
1202                                     exceptionStringIn => errorMessage);
1203           raise_application_error(errorCode,
1204                                   errorMessage);
1205         when others then
1206           if(groupMemberCursor%isopen) then
1207             close groupMemberCursor;
1208           end if;
1209           ame_util.runtimeException(packageNameIn => 'ame_api3',
1210                                     routineNameIn => 'getGroupMembers2',
1211                                     exceptionNumberIn => sqlcode,
1212                                     exceptionStringIn => sqlerrm);
1213           raise;
1214     end getGroupMembers2;
1215   procedure getGroupMembers3(applicationIdIn in number default null,
1216                              transactionTypeIn in varchar2 default null,
1217                              transactionIdIn in varchar2 default null,
1218                              groupIdIn in number,
1219                              memberNamesOut out nocopy ame_util.longStringList,
1220                              memberOrderNumbersOut out nocopy ame_util.idList,
1221                              memberDisplayNamesOut out nocopy ame_util.longStringList)as
1222       cursor groupMemberCursor(groupIdIn in integer) is
1223         select
1224           parameter,
1225           upper(parameter_name),
1226           query_string,
1227           order_number,
1228           orig_system,
1229           orig_system_id
1230           from ame_approval_group_members
1231           where
1232             approval_group_id = groupIdIn
1233           order by order_number;
1234       badDynamicMemberException exception;
1235       noItemBindException exception;
1239       displayNames ame_util.longStringList;
1236       dynamicCursor integer;
1237       colonLocation1 integer;
1238       colonLocation2 integer;
1240       errorCode integer;
1241       errorMessage ame_util.longestStringType;
1242       approverNames ame_util.longStringList;
1243       orig_systemList ame_util.stringList;
1244       orig_systemIdList ame_util.idList;
1245       memberOrigSystem ame_util.stringType;
1246       memberOrigSystemId number;
1247       noTransIdDefinedException exception;
1248       orderNumbers ame_util.idList;
1249       origSystemIds ame_util.idList;
1250       origSystems ame_util.stringList;
1251       outputIndex integer;
1252       parameters ame_util.longStringList;
1253       queryStrings ame_util.longestStringList;
1254       rowsFound integer;
1255       tempGroupMembers dbms_sql.Varchar2_Table;
1256       upperParameterNames ame_util.stringList;
1257       tempGroupName       ame_util.stringType;
1258       l_error_code number;
1259       begin
1260         open groupMemberCursor(groupIdIn => groupIdIn);
1261         fetch groupMemberCursor bulk collect
1262           into
1263             parameters,
1264             upperParameterNames,
1265             queryStrings,
1266             orderNumbers,
1267             orig_systemList,
1268             orig_systemIdList;
1269         close groupMemberCursor;
1270         outputIndex := 0; /* pre-increment */
1271         for i in 1 .. parameters.count loop
1272           if(upperParameterNames(i) = upper(ame_util.approverOamGroupId)) then
1273             dynamicCursor := dbms_sql.open_cursor;
1274             dbms_sql.parse(dynamicCursor,
1275                            ame_util.removeReturns(stringIn => queryStrings(i),
1276                                                   replaceWithSpaces => true),
1277                            dbms_sql.native);
1278             if(instrb(queryStrings(i),
1279                       ame_util.transactionIdPlaceholder) > 0) then
1280               if transactionIdIn is null then
1281                  dbms_sql.close_cursor(dynamicCursor);
1282                  raise noTransIdDefinedException;
1283               end if;
1284               dbms_sql.bind_variable(dynamicCursor,
1285                                      ame_util.transactionIdPlaceholder,
1286                                      transactionIdIn,
1287                                      50);
1288             end if;
1289             if(instrb(queryStrings(i),ame_util2.itemClassPlaceHolder) > 0) or
1290                (instrb(queryStrings(i),ame_util2.itemIdPlaceHolder) > 0) then
1291               dbms_sql.close_cursor(dynamicCursor);
1292               raise noItemBindException;
1293             end if;
1294             dbms_sql.define_array(dynamicCursor,
1295                                   1,
1296                                   tempGroupMembers,
1297                                   100,
1298                                   1);
1299             rowsFound := dbms_sql.execute(dynamicCursor);
1300             loop
1301               rowsFound := dbms_sql.fetch_rows(dynamicCursor);
1302               dbms_sql.column_value(dynamicCursor,
1303                                     1,
1304                                     tempGroupMembers);
1305               exit when rowsFound < 100;
1306             end loop;
1307             dbms_sql.close_cursor(dynamicCursor);
1308             /*
1309               Dynamic groups' query strings may return rows having one of two forms:
1310                 (1) approver_type:approver_id
1311                 (2) orig_system:orig_system_id:approver_name
1312             */
1313             for j in 1 .. tempGroupMembers.count loop
1314               colonLocation1 := instrb(tempGroupMembers(j), ':', 1, 1);
1315               colonLocation2 := instrb(tempGroupMembers(j), ':', 1, 2);
1316               if(colonLocation1 = 0) then
1317                 raise badDynamicMemberException;
1318               end if;
1319               outputIndex := outputIndex + 1;
1320               memberOrderNumbersOut(outputIndex) := j;
1321               if(colonLocation2 = 0) then /* first case (old style) */
1322                 memberOrigSystemId :=
1323                   substrb(tempGroupMembers(j), (instrb(tempGroupMembers(j), ':', 1, 1) + 1));
1324                 if(substrb(upper(tempGroupMembers(j)), 1, (instrb(tempGroupMembers(j), ':', 1, 1) - 1)) =
1325                    upper(ame_util.approverPersonId)) then
1326                 memberOrigSystem := ame_util.perOrigSystem;
1327                 elsif (substrb(upper(tempGroupMembers(j)), 1, (instrb(tempGroupMembers(j), ':', 1, 1) - 1)) =
1328                    upper(ame_util.approverUserId)) then
1329                   memberOrigSystem := ame_util.fndUserOrigSystem;
1330                 else
1331                   memberOrigSystem :=
1332                    substrb(tempGroupMembers(j), 1, (instrb(tempGroupMembers(j), ':', 1, 1)-1));
1333                   memberOrigSystemId :=
1334                    substrb(tempGroupMembers(j),instrb(tempGroupMembers(j), ':', 1, 1) + 1);
1335                 end if;
1336               else
1337                 memberOrigSystem :=
1338                   substrb(tempGroupMembers(j), 1, (instrb(tempGroupMembers(j), ':', 1, 1)-1));
1339                 memberOrigSystemId :=
1340                   substrb(tempGroupMembers(j), (instrb(tempGroupMembers(j), ':', 1, 1)+1),
1341                     (instrb(tempGroupMembers(j), ':', 1, 2)-1));
1342               end if;
1343               begin
1344                 ame_approver_type_pkg.getWfRolesNameAndDisplayName(
1345                   origSystemIn => memberOrigSystem,
1346                   origSystemIdIn => memberOrigSystemId,
1347                   nameOut => memberNamesOut(outputIndex),
1348                   displayNameOut => memberDisplayNamesOut(outputIndex));
1349               exception
1350                when others then
1351                  l_error_code := sqlcode;
1352                  if l_error_code = -20213 then
1356                                                 tokenNameOneIn  => 'PROCESS_NAME',
1353                  errorCode := -20223;
1354                  errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
1355                                                 messageNameIn => 'AME_400838_INV_APR_FOUND',
1357                                                 tokenValueOneIn => 'ame_api3.getGroupMembers3',
1358                                                 tokenNameTwoIn => 'ORIG_SYSTEM',
1359                                                 tokenValueTwoIn => memberOrigSystem,
1360                                                 tokenNameThreeIn => 'ORIG_SYSEM_ID',
1361                                                 tokenValueThreeIn => memberOrigSystemId);
1362                  raise_application_error(errorCode,errorMessage);
1363                  end if;
1364                  raise;
1365               end;
1366             end loop;
1367           else /* Copy the static group into the engGroup caches. */
1368             outputIndex := outputIndex + 1;
1369             memberOrderNumbersOut(outputIndex) := orderNumbers(i);
1370             begin
1371               ame_approver_type_pkg.getWfRolesNameAndDisplayName(
1372                 origSystemIn => orig_systemList(i),
1373                 origSystemIdIn => orig_systemIdList(i),
1374                 nameOut => memberNamesOut(outputIndex),
1375                 displayNameOut => memberDisplayNamesOut(outputIndex));
1376             exception
1377              when others then
1378                l_error_code := sqlcode;
1379                if l_error_code = -20213 then
1380                errorCode := -20223;
1381                errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
1382                                               messageNameIn => 'AME_400838_INV_APR_FOUND',
1383                                               tokenNameOneIn  => 'PROCESS_NAME',
1384                                               tokenValueOneIn => 'ame_api3.getGroupMembers3',
1385                                               tokenNameTwoIn => 'ORIG_SYSTEM',
1386                                               tokenValueTwoIn => orig_systemList(i),
1387                                               tokenNameThreeIn => 'ORIG_SYSEM_ID',
1388                                               tokenValueThreeIn => orig_systemIdList(i));
1389                raise_application_error(errorCode,errorMessage);
1390                end if;
1391                raise;
1392             end;
1393           end if;
1394         end loop;
1395       exception
1396         when badDynamicMemberException then
1397           if(groupMemberCursor%isopen) then
1398             close groupMemberCursor;
1399           end if;
1400           errorCode := -20315;
1401           errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
1402                                       messageNameIn => 'AME_400454_GRP_DYN_QRY_ERR');
1403           ame_util.runtimeException(packageNameIn => 'ame_api3',
1404                                     routineNameIn => 'getGroupMembers3',
1405                                     exceptionNumberIn => errorCode,
1406                                     exceptionStringIn => errorMessage);
1407           raise_application_error(errorCode,
1408                                   errorMessage);
1409         when noTransIdDefinedException then
1410           if(groupMemberCursor%isopen) then
1411             close groupMemberCursor;
1412           end if;
1413           errorCode := -20001;
1414           ame_api5.getApprovalGroupName(groupIdIn    => groupIdIn
1415                                        ,groupNameOut => tempGroupName);
1416           errorMessage := ame_util.getMessage(
1417                            applicationShortNameIn => 'PER',
1418                            messageNameIn   => 'AME_400455_GRP_DYN_NULL_TXID',
1419                            tokenNameOneIn  => 'APPROVAL_GROUP',
1420                            tokenValueOneIn => tempGroupName);
1421           ame_util.runtimeException(packageNameIn => 'ame_api3',
1422                                     routineNameIn => 'getGroupMembers3',
1423                                     exceptionNumberIn => errorCode,
1424                                     exceptionStringIn => errorMessage);
1425           raise_application_error(errorCode,
1426                                   errorMessage);
1427        when noItemBindException then
1428           if(groupMemberCursor%isopen) then
1429             close groupMemberCursor;
1430           end if;
1431           memberDisplayNamesOut.delete;
1432           errorCode := -20316;
1433           ame_api5.getApprovalGroupName(groupIdIn    => groupIdIn
1434                                        ,groupNameOut => tempGroupName);
1435           errorMessage := ame_util.getMessage(
1436                            applicationShortNameIn => 'PER',
1437                            messageNameIn   => 'AME_400798_GROUP_ITEM_BIND',
1438                            tokenNameOneIn  => 'APPROVER_GROUP',
1439                            tokenValueOneIn => tempGroupName);
1440           ame_util.runtimeException(packageNameIn => 'ame_api3',
1441                                     routineNameIn => 'getGroupMembers3',
1442                                     exceptionNumberIn => errorCode,
1443                                     exceptionStringIn => errorMessage);
1444           raise_application_error(errorCode,
1445                                   errorMessage);
1446         when others then
1447           if(groupMemberCursor%isopen) then
1448             close groupMemberCursor;
1449           end if;
1450           ame_util.runtimeException(packageNameIn => 'ame_api3',
1451                                     routineNameIn => 'getGroupMembers3',
1452                                     exceptionNumberIn => sqlcode,
1453                                     exceptionStringIn => sqlerrm);
1454           raise;
1458                              transactionIdIn in varchar2 default null,
1455   end getGroupMembers3;
1456   procedure getGroupMembers4(applicationIdIn in number default null,
1457                              transactionTypeIn in varchar2 default null,
1459                              groupIdIn in number,
1460                              memberNamesOut out nocopy ame_util.longStringList,
1461                              memberOrderNumbersOut out nocopy ame_util.idList,
1462                              memberDisplayNamesOut out nocopy ame_util.longStringList,
1463                              memberOrigSystemIdsOut out nocopy ame_util.idList,
1464                              memberOrigSystemsOut out nocopy ame_util.stringList)as
1465       cursor groupMemberCursor(groupIdIn in integer) is
1466         select
1467           orig_system,
1468           orig_system_id,
1469           parameter,
1470           upper(parameter_name),
1471           query_string,
1472           order_number
1473           from ame_approval_group_members
1474           where
1475             approval_group_id = groupIdIn
1476           order by order_number;
1477       badDynamicMemberException exception;
1478       noItemBindException exception;
1479       dynamicCursor integer;
1480       colonLocation1 integer;
1481       colonLocation2 integer;
1482       displayNames ame_util.longStringList;
1483       errorCode integer;
1484       errorMessage ame_util.longestStringType;
1485       approverNames ame_util.longStringList;
1486       noTransIdDefinedException exception;
1487       orderNumbers ame_util.idList;
1488       origSystemIds ame_util.idList;
1489       origSystems ame_util.stringList;
1490       outputIndex integer;
1491       parameters ame_util.longStringList;
1492       queryStrings ame_util.longestStringList;
1493       rowsFound integer;
1494       tempGroupMembers dbms_sql.Varchar2_Table;
1495       upperParameterNames ame_util.stringList;
1496       tempGroupName       ame_util.stringType;
1497       l_error_code number;
1498       begin
1499         open groupMemberCursor(groupIdIn => groupIdIn);
1500         fetch groupMemberCursor bulk collect
1501           into
1502             origSystems,
1503             origSystemIds,
1504             parameters,
1505             upperParameterNames,
1506             queryStrings,
1507             orderNumbers;
1508         close groupMemberCursor;
1509         outputIndex := 0; /* pre-increment */
1510         for i in 1 .. parameters.count loop
1511           if(upperParameterNames(i) = upper(ame_util.approverOamGroupId)) then
1512             dynamicCursor := dbms_sql.open_cursor;
1513             dbms_sql.parse(dynamicCursor,
1514                            ame_util.removeReturns(stringIn => queryStrings(i),
1515                                                   replaceWithSpaces => true),
1516                            dbms_sql.native);
1517             if(instrb(queryStrings(i),
1518                       ame_util.transactionIdPlaceholder) > 0) then
1519               if transactionIdIn is null then
1520                  dbms_sql.close_cursor(dynamicCursor);
1521                  raise noTransIdDefinedException;
1522               end if;
1523               dbms_sql.bind_variable(dynamicCursor,
1524                                      ame_util.transactionIdPlaceholder,
1525                                      transactionIdIn,
1526                                      50);
1527             end if;
1528             if(instrb(queryStrings(i),ame_util2.itemClassPlaceHolder) > 0) or
1529                (instrb(queryStrings(i),ame_util2.itemIdPlaceHolder) > 0) then
1530               dbms_sql.close_cursor(dynamicCursor);
1531               raise noItemBindException;
1532             end if;
1533             dbms_sql.define_array(dynamicCursor,
1534                                   1,
1535                                   tempGroupMembers,
1536                                   100,
1537                                   1);
1538             rowsFound := dbms_sql.execute(dynamicCursor);
1539             loop
1540               rowsFound := dbms_sql.fetch_rows(dynamicCursor);
1541               dbms_sql.column_value(dynamicCursor,
1542                                     1,
1543                                     tempGroupMembers);
1544               exit when rowsFound < 100;
1545             end loop;
1546             dbms_sql.close_cursor(dynamicCursor);
1547             /*
1548               Dynamic groups' query strings may return rows having one of two forms:
1549                 (1) approver_type:approver_id
1550                 (2) orig_system:orig_system_id:approver_name
1551             */
1552             for j in 1 .. tempGroupMembers.count loop
1553               colonLocation1 := instrb(tempGroupMembers(j), ':', 1, 1);
1554               colonLocation2 := instrb(tempGroupMembers(j), ':', 1, 2);
1555               if(colonLocation1 = 0) then
1556                 raise badDynamicMemberException;
1557               end if;
1558               outputIndex := outputIndex + 1;
1559               memberOrderNumbersOut(outputIndex) := j;
1560               if(colonLocation2 = 0) then /* first case (old style) */
1561                 memberOrigSystemIdsOut(outputIndex) :=
1562                   substrb(tempGroupMembers(j), (instrb(tempGroupMembers(j), ':', 1, 1) + 1));
1563                 if(substrb(upper(tempGroupMembers(j)), 1, (instrb(tempGroupMembers(j), ':', 1, 1) - 1)) =
1564                    upper(ame_util.approverPersonId)) then
1565                   memberOrigSystemsOut(outputIndex) := ame_util.perOrigSystem;
1566                 elsif (substrb(upper(tempGroupMembers(j)), 1, (instrb(tempGroupMembers(j), ':', 1, 1) - 1)) =
1567                    upper(ame_util.approverUserId)) then
1568                   memberOrigSystemsOut(outputIndex) := ame_util.fndUserOrigSystem;
1569                 else
1573                    substrb(tempGroupMembers(j),instrb(tempGroupMembers(j), ':', 1, 1) + 1);
1570                   memberOrigSystemsOut(outputIndex) :=
1571                    substrb(tempGroupMembers(j), 1, (instrb(tempGroupMembers(j), ':', 1, 1)-1));
1572                   memberOrigSystemIdsOut(outputIndex) :=
1574                 end if;
1575               else
1576                 memberOrigSystemsOut(outputIndex) :=
1577                   substrb(tempGroupMembers(j), 1, (instrb(tempGroupMembers(j), ':', 1, 1)-1));
1578                 memberOrigSystemIdsOut(outputIndex) :=
1579                   substrb(tempGroupMembers(j), (instrb(tempGroupMembers(j), ':', 1, 1)+1),
1580                     (instrb(tempGroupMembers(j), ':', 1, 2)-1));
1581               end if;
1582               begin
1583                 ame_approver_type_pkg.getWfRolesNameAndDisplayName(
1584                   origSystemIn => memberOrigSystemsOut(outputIndex),
1585                   origSystemIdIn => memberOrigSystemIdsOut(outputIndex),
1586                   nameOut => memberNamesOut(outputIndex),
1587                   displayNameOut => memberDisplayNamesOut(outputIndex));
1588               exception
1589                when others then
1590                  l_error_code := sqlcode;
1591                  if l_error_code = -20213 then
1592                  errorCode := -20223;
1593                  errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
1594                                                 messageNameIn => 'AME_400838_INV_APR_FOUND',
1595                                                 tokenNameOneIn  => 'PROCESS_NAME',
1596                                                 tokenValueOneIn => 'ame_api3.getGroupMembers4',
1597                                                 tokenNameTwoIn => 'ORIG_SYSTEM',
1598                                                 tokenValueTwoIn => memberOrigSystemsOut(outputIndex),
1599                                                 tokenNameThreeIn => 'ORIG_SYSEM_ID',
1600                                                 tokenValueThreeIn =>  memberOrigSystemIdsOut(outputIndex));
1601                  raise_application_error(errorCode,errorMessage);
1602                  end if;
1603                  raise;
1604               end;
1605             end loop;
1606           else /* Copy the static group into the engGroup caches. */
1607             outputIndex := outputIndex + 1;
1608             memberOrderNumbersOut(outputIndex) := orderNumbers(i);
1609             begin
1610               ame_approver_type_pkg.getWfRolesNameAndDisplayName(
1611                 origSystemIn => origSystems(i),
1612                 origSystemIdIn => origSystemIds(i),
1613                 nameOut =>  memberNamesOut(outputIndex),
1614                 displayNameOut => memberDisplayNamesOut(outputIndex));
1615             exception
1616              when others then
1617                l_error_code := sqlcode;
1618                if l_error_code = -20213 then
1619                errorCode := -20223;
1620                errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
1621                                               messageNameIn => 'AME_400838_INV_APR_FOUND',
1622                                               tokenNameOneIn  => 'PROCESS_NAME',
1623                                               tokenValueOneIn => 'ame_api3.getGroupMembers4',
1624                                               tokenNameTwoIn => 'ORIG_SYSTEM',
1625                                               tokenValueTwoIn => origSystems(i),
1626                                               tokenNameThreeIn => 'ORIG_SYSEM_ID',
1627                                               tokenValueThreeIn => origSystemIds(i));
1628                raise_application_error(errorCode,errorMessage);
1629                end if;
1630                raise;
1631             end;
1632             memberOrigSystemsOut(outputIndex) := origSystems(i);
1633             memberOrigSystemIdsOut(outputIndex) := origSystemIds(i);
1634           end if;
1635         end loop;
1636       exception
1637         when badDynamicMemberException then
1638           if(groupMemberCursor%isopen) then
1639             close groupMemberCursor;
1640           end if;
1641           errorCode := -20315;
1642           errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
1643                                       messageNameIn => 'AME_400454_GRP_DYN_QRY_ERR');
1644           ame_util.runtimeException(packageNameIn => 'ame_api3',
1645                                     routineNameIn => 'getGroupMembers4',
1646                                     exceptionNumberIn => errorCode,
1647                                     exceptionStringIn => errorMessage);
1648           raise_application_error(errorCode,
1649                                   errorMessage);
1650         when noTransIdDefinedException then
1651           if(groupMemberCursor%isopen) then
1652             close groupMemberCursor;
1653           end if;
1654           errorCode := -20001;
1655           ame_api5.getApprovalGroupName(groupIdIn    => groupIdIn
1656                                        ,groupNameOut => tempGroupName);
1657           errorMessage := ame_util.getMessage(
1658                            applicationShortNameIn => 'PER',
1659                            messageNameIn   => 'AME_400455_GRP_DYN_NULL_TXID',
1660                            tokenNameOneIn  => 'APPROVAL_GROUP',
1661                            tokenValueOneIn => tempGroupName);
1662           ame_util.runtimeException(packageNameIn => 'ame_api3',
1663                                     routineNameIn => 'getGroupMembers4',
1664                                     exceptionNumberIn => errorCode,
1665                                     exceptionStringIn => errorMessage);
1666           raise_application_error(errorCode,
1667                                   errorMessage);
1668         when noItemBindException then
1669           if(groupMemberCursor%isopen) then
1670             close groupMemberCursor;
1671           end if;
1672           memberDisplayNamesOut.delete;
1673           errorCode := -20316;
1677                            applicationShortNameIn => 'PER',
1674           ame_api5.getApprovalGroupName(groupIdIn    => groupIdIn
1675                                        ,groupNameOut => tempGroupName);
1676           errorMessage := ame_util.getMessage(
1678                            messageNameIn   => 'AME_400798_GROUP_ITEM_BIND',
1679                            tokenNameOneIn  => 'APPROVER_GROUP',
1680                            tokenValueOneIn => tempGroupName);
1681           ame_util.runtimeException(packageNameIn => 'ame_api3',
1682                                     routineNameIn => 'getGroupMembers4',
1683                                     exceptionNumberIn => errorCode,
1684                                     exceptionStringIn => errorMessage);
1685           raise_application_error(errorCode,
1686                                   errorMessage);
1687         when others then
1688           if(groupMemberCursor%isopen) then
1689             close groupMemberCursor;
1690           end if;
1691           ame_util.runtimeException(packageNameIn => 'ame_api3',
1692                                     routineNameIn => 'getGroupMembers4',
1693                                     exceptionNumberIn => sqlcode,
1694                                     exceptionStringIn => sqlerrm);
1695           raise;
1696   end getGroupMembers4;
1697   procedure getItemClasses( applicationIdIn in number,
1698                             transactionTypeIn in varchar2,
1699                             itemClassIdsOut out nocopy ame_util.idList,
1700                             itemClassNamesOut out nocopy ame_util.stringList) as
1701     ameAppId integer;
1702     begin
1703       ameAppId := ame_admin_pkg.getApplicationId(fndAppIdIn => applicationIdIn,
1704                                                  transactionTypeIdIn => transactionTypeIn);
1705       ame_admin_pkg.getTransTypeItemClasses2(applicationIdIn => ameAppId,
1706                                             itemClassIdsOut => itemClassIdsOut,
1707                                             itemClassNamesOut => itemClassNamesOut);
1708     exception
1709       when others then
1710         ame_util.runtimeException(packageNameIn => 'ame_api3',
1711                                   routineNameIn => 'getItemClasses',
1712                                   exceptionNumberIn => sqlcode,
1713                                   exceptionStringIn => sqlerrm);
1714         raise;
1715     end getItemClasses;
1716   procedure getItemClassId( itemClassNameIn in varchar2,
1717                             itemClassIdOut out nocopy number) as
1718     ameAppId integer;
1719     begin
1720       itemClassIdOut := ame_admin_pkg.getItemClassIdByName(itemClassNameIn => itemClassNameIn);
1721     exception
1722       when others then
1723         ame_util.runtimeException(packageNameIn => 'ame_api3',
1724                                   routineNameIn => 'getItemClassId',
1725                                   exceptionNumberIn => sqlcode,
1726                                   exceptionStringIn => sqlerrm);
1727         raise;
1728   end getItemClassId;
1729   procedure getItemClassName( itemClassIdIn in number,
1730                               itemClassNameOut out nocopy varchar2) as
1731     ameAppId integer;
1732     begin
1733       itemClassNameOut := ame_admin_pkg.getItemClassName(itemClassIdIn => itemClassIdIn);
1734     exception
1735       when others then
1736         ame_util.runtimeException(packageNameIn => 'ame_api3',
1737                                   routineNameIn => 'getItemClassName',
1738                                   exceptionNumberIn => sqlcode,
1739                                   exceptionStringIn => sqlerrm);
1740         raise;
1741     end getItemClassName;
1742     procedure getApproverDetails(nameIn                in varchar2
1743                                  ,validityOut          out NOCOPY varchar2
1744                                  ,displayNameOut       out NOCOPY varchar2
1745                                  ,origSystemIdOut      out NOCOPY integer
1746                                  ,origSystemOut        out NOCOPY varchar2 ) as
1747     begin
1748       validityOut := 'INVALID';
1749       select
1750         display_name,
1751         orig_system,
1752         orig_system_id
1753         into
1754           displayNameOut,
1755           origSystemOut,
1756           origSystemIdOut
1757         from wf_roles
1758         where
1759           name = nameIn and
1760           status = 'ACTIVE' and
1761           (expiration_date is null or
1762             sysdate < expiration_date) and
1763           rownum < 2;
1764         validityOut := 'VALID';
1765       exception
1766         when no_data_found then
1767           begin
1768             select
1769               display_name,
1770               orig_system,
1771               orig_system_id
1772               into
1773                 displayNameOut,
1774                 origSystemOut,
1775                 origSystemIdOut
1776               from wf_local_roles
1777               where
1778                 name = nameIn and
1779                 rownum < 2;
1780             validityOut := 'INACTIVE';
1781             exception
1782               when no_data_found then
1783                 displayNameOut := nameIn;
1784                 origSystemOut  := 'PER';
1785           end;
1786     end getApproverDetails;
1787   procedure getOldApprovers( applicationIdIn in number,
1788                              transactionTypeIn in varchar2,
1789                              transactionIdIn in varchar2,
1790                              oldApproversOut out nocopy ame_util.approversTable2) as
1791     ameAppId integer;
1792     cursor oldApproverCursor(applicationIdIn in integer,
1793                              transactionIdIn in varchar2) is
1794       select
1795         name,
1796         item_class,
1797         item_id,
1801         approval_status,
1798         approver_category,
1799         api_insertion,
1800         authority,
1802         action_type_id,
1803         group_or_chain_id,
1804         occurrence
1805         from ame_temp_old_approver_lists
1806         where
1807           application_id = applicationIdIn and
1808           transaction_id = transactionIdIn
1809         order by order_number;
1810       tempIndex integer;
1811       l_display_name varchar2(400);
1812       l_valid varchar2(50);
1813     begin
1814       ameAppId := ame_admin_pkg.getApplicationId(fndAppIdIn => applicationIdIn,
1815                                                  transactionTypeIdIn => transactionTypeIn);
1816       tempIndex := 0;
1817       for tempOldApprover in oldApproverCursor(applicationIdIn => ameAppId,
1818                                                transactionIdIn => transactionIdIn) loop
1819         tempIndex := tempIndex + 1;
1820         oldApproversOut(tempIndex).name := tempOldApprover.name;
1821         oldApproversOut(tempIndex).item_class := tempOldApprover.item_class;
1822         oldApproversOut(tempIndex).item_id := tempOldApprover.item_id;
1823         oldApproversOut(tempIndex).approver_category := tempOldApprover.approver_category;
1824         oldApproversOut(tempIndex).api_insertion := tempOldApprover.api_insertion;
1825         oldApproversOut(tempIndex).authority := tempOldApprover.authority;
1826         oldApproversOut(tempIndex).approval_status := tempOldApprover.approval_status;
1827         oldApproversOut(tempIndex).action_type_id := tempOldApprover.action_type_id;
1828         oldApproversOut(tempIndex).group_or_chain_id := tempOldApprover.group_or_chain_id;
1829         oldApproversOut(tempIndex).occurrence := tempOldApprover.occurrence;
1830         begin
1831         ame_approver_type_pkg.getApproverOrigSystemAndId
1832              (nameIn          => tempOldApprover.name
1833              ,origSystemOut   => oldApproversOut(tempIndex).orig_system
1834              ,origSystemIdOut => oldApproversOut(tempIndex).orig_system_id);
1835         exception
1836           when others then
1837              getApproverDetails(nameIn => tempOldApprover.name
1838                                  ,validityOut     => l_valid
1839                                  ,displayNameOut  => l_display_name
1840                                  ,origSystemIdOut => oldApproversOut(tempIndex).orig_system_id
1841                                  ,origSystemOut   => oldApproversOut(tempIndex).orig_system);
1842             if l_valid = 'INVALID' then
1843               oldApproversOut(tempIndex).orig_system_id := null;
1844               oldApproversOut(tempIndex).orig_system := null;
1845             end if;
1846         end;
1847         /*
1848           The old approver list does not maintain source.  Calling applications requiring
1849           source data must get it by calling getNextApprover or getAllApprovers.
1850         */
1851         oldApproversOut(tempIndex).source := null;
1852       end loop;
1853       exception
1854         when others then
1855           ame_util.runtimeException(packageNameIn => 'ame_api3',
1856                                     routineNameIn => 'getOldApprovers',
1857                                     exceptionNumberIn => sqlcode,
1858                                     exceptionStringIn => sqlerrm);
1859           oldApproversOut.delete;
1860           ame_api2.getAdminApprover(applicationIdIn => applicationIdIn,
1861                                     transactionTypeIn => transactionTypeIn,
1862                                     adminApproverOut => oldApproversOut(1));
1863           raise;
1864     end getOldApprovers;
1865   procedure getRuleDetails1( ruleIdIn in number,
1866                              ruleTypeOut out nocopy varchar2,
1867                              ruleDescriptionOut out nocopy varchar2,
1868                              conditionIdsOut out nocopy ame_util.idList,
1869                              actionTypeNamesOut out nocopy ame_util.stringList,
1870                              actionTypeDescriptionsOut out nocopy ame_util.stringList,
1871                              actionDescriptionsOut out nocopy ame_util.stringList) as
1872     cursor actionCursor is
1873       select
1874         ame_action_types.name,
1875         ame_action_types.description,
1876         ame_actions.description
1877       from
1878         ame_action_usages,
1879         ame_action_types,
1880         ame_actions
1881       where
1882         ame_action_usages.rule_id = ruleIdIn and
1883         ame_actions.action_id = ame_action_usages.action_id and
1884         ame_action_types.action_type_id = ame_actions.action_type_id and
1885         sysdate between
1886           ame_action_usages.start_date and
1887           nvl(ame_action_usages.end_date - ame_util.oneSecond, sysdate) and
1888         sysdate between
1889           ame_action_types.start_date and
1890           nvl(ame_action_types.end_date - ame_util.oneSecond, sysdate) and
1891         sysdate between
1892           ame_actions.start_date and
1893           nvl(ame_actions.end_date - ame_util.oneSecond, sysdate);
1894     cursor conditionCursor(ruleIdIn in integer) is
1895       select condition_id
1896       from ame_condition_usages
1897       where
1898         ame_condition_usages.rule_id = ruleIdIn and
1899         sysdate between
1900           start_date and
1901           nvl(end_date - ame_util.oneSecond, sysdate);
1902     cursor ruleCursor is
1903       select
1904         ame_rules.rule_type,
1905         ame_rules.description
1906       from
1907         ame_rules
1908       where
1909         ame_rules.rule_id = ruleIdIn and
1910         sysdate between
1911           ame_rules.start_date and
1912           nvl(ame_rules.end_date - ame_util.oneSecond, sysdate) ;
1913     begin
1914       open ruleCursor;
1918       close ruleCursor;
1915       fetch ruleCursor into
1916         ruleTypeOut,
1917         ruleDescriptionOut;
1919       open actionCursor;
1920       fetch actionCursor bulk collect into
1921         actionTypeNamesOut,
1922         actionTypeDescriptionsOut,
1923         actionDescriptionsOut;
1924       close actionCursor;
1925       open conditionCursor(ruleIdIn => ruleIdIn);
1926       fetch conditionCursor bulk collect
1927         into conditionIdsOut;
1928       close conditionCursor;
1929       exception
1930         when others then
1931           ame_util.runtimeException(packageNameIn => 'ame_api3',
1932                                     routineNameIn => 'getRuleDetails1',
1933                                     exceptionNumberIn => sqlcode,
1934                                     exceptionStringIn => sqlerrm);
1935           conditionIdsOut.delete;
1936           raise;
1937     end getRuleDetails1;
1938   procedure getRuleDetails2( ruleIdIn in number,
1939                              ruleTypeOut out nocopy varchar2,
1940                              ruleDescriptionOut out nocopy varchar2,
1941                              conditionDescriptionsOut out nocopy ame_util.longestStringList,
1942                              actionTypeNamesOut out nocopy ame_util.stringList,
1943                              actionTypeDescriptionsOut out nocopy ame_util.stringList,
1944                              actionDescriptionsOut out nocopy ame_util.stringList) as
1945     cursor actionCursor is
1946       select
1947         ame_action_types.name,
1948         ame_action_types.description,
1949         ame_actions.description
1950       from
1951         ame_action_usages,
1952         ame_action_types,
1953         ame_actions
1954       where
1955         ame_action_usages.rule_id = ruleIdIn and
1956         ame_actions.action_id = ame_action_usages.action_id and
1957         ame_action_types.action_type_id = ame_actions.action_type_id and
1958         sysdate between
1959           ame_action_usages.start_date and
1960           nvl(ame_action_usages.end_date - ame_util.oneSecond, sysdate) and
1961         sysdate between
1962           ame_action_types.start_date and
1963           nvl(ame_action_types.end_date - ame_util.oneSecond, sysdate) and
1964         sysdate between
1965           ame_actions.start_date and
1966           nvl(ame_actions.end_date - ame_util.oneSecond, sysdate);
1967     cursor conditionCursor(ruleIdIn in integer) is
1968       select ame_condition_pkg.getDescription(ame_condition_usages.condition_id)
1969       from ame_condition_usages
1970       where
1971         ame_condition_usages.rule_id = ruleIdIn and
1972         sysdate between
1973           ame_condition_usages.start_date and
1974           nvl(ame_condition_usages.end_date - ame_util.oneSecond, sysdate);
1975     cursor ruleCursor is
1976       select
1977         ame_rules.rule_type,
1978         ame_rules.description
1979       from
1980         ame_rules
1981       where
1982         ame_rules.rule_id = ruleIdIn and
1983         sysdate between
1984           ame_rules.start_date and
1985           nvl(ame_rules.end_date - ame_util.oneSecond, sysdate) ;
1986     begin
1987       open ruleCursor;
1988       fetch ruleCursor into
1989         ruleTypeOut,
1990         ruleDescriptionOut;
1991       close ruleCursor;
1992       open actionCursor;
1993       fetch actionCursor bulk collect into
1994         actionTypeNamesOut,
1995         actionTypeDescriptionsOut,
1996         actionDescriptionsOut;
1997       close actionCursor;
1998       open conditionCursor(ruleIdIn => ruleIdIn);
1999       fetch conditionCursor bulk collect
2000         into conditionDescriptionsOut;
2001       close conditionCursor;
2002       exception
2003         when others then
2004           ame_util.runtimeException(packageNameIn => 'ame_api3',
2005                                     routineNameIn => 'getRuleDetails2',
2006                                     exceptionNumberIn => sqlcode,
2007                                     exceptionStringIn => sqlerrm);
2008           conditionDescriptionsOut.delete;
2009           raise;
2010     end getRuleDetails2;
2011   procedure getRuleDetails3( ruleIdIn in number,
2012                              ruleTypeOut out nocopy varchar2,
2013                              ruleDescriptionOut out nocopy varchar2,
2014                              conditionIdsOut out nocopy ame_util.idList,
2015                              conditionDescriptionsOut out nocopy ame_util.longestStringList,
2016                              conditionHasLOVsOut out nocopy ame_util.charList,
2017                              actionTypeNamesOut out nocopy ame_util.stringList,
2018                              actionTypeDescriptionsOut out nocopy ame_util.stringList,
2019                              actionDescriptionsOut out nocopy ame_util.stringList) as
2020     cursor actionCursor is
2021       select
2022         ame_action_types.name,
2023         ame_action_types.description,
2024         ame_actions.description
2025       from
2026         ame_action_usages,
2027         ame_action_types,
2028         ame_actions
2029       where
2030         ame_action_usages.rule_id = ruleIdIn and
2031         ame_actions.action_id = ame_action_usages.action_id and
2032         ame_action_types.action_type_id = ame_actions.action_type_id and
2033         sysdate between
2034           ame_action_usages.start_date and
2035           nvl(ame_action_usages.end_date - ame_util.oneSecond, sysdate) and
2036         sysdate between
2037           ame_action_types.start_date and
2038           nvl(ame_action_types.end_date - ame_util.oneSecond, sysdate) and
2039         sysdate between
2040           ame_actions.start_date and
2041           nvl(ame_actions.end_date - ame_util.oneSecond, sysdate);
2042     cursor conditionCursor(ruleIdIn in integer) is
2046         decode(ame_attributes.attribute_type,
2043       select
2044         ame_conditions.condition_id,
2045         ame_condition_pkg.getDescription(ame_conditions.condition_id),
2047                ame_util.stringAttributeType, ame_util.booleanTrue,
2048                /* default */                 ame_util.booleanFalse)
2049       from
2050         ame_conditions,
2051         ame_condition_usages,
2052         ame_attributes
2053       where
2054         ame_condition_usages.rule_id = ruleIdIn and
2055         ame_conditions.condition_id = ame_condition_usages.condition_id and
2056         ame_attributes.attribute_id = ame_conditions.attribute_id and
2057         sysdate between
2058           ame_condition_usages.start_date and
2059           nvl(ame_condition_usages.end_date - ame_util.oneSecond, sysdate) and
2060         sysdate between
2061           ame_conditions.start_date and
2062           nvl(ame_conditions.end_date - ame_util.oneSecond, sysdate) and
2063         sysdate between
2064           ame_attributes.start_date and
2065           nvl(ame_attributes.end_date - ame_util.oneSecond, sysdate);
2066     cursor ruleCursor is
2067       select
2068         ame_rules.rule_type,
2069         ame_rules.description
2070       from
2071         ame_rules
2072       where
2073         ame_rules.rule_id = ruleIdIn and
2074         sysdate between
2075           ame_rules.start_date and
2076           nvl(ame_rules.end_date - ame_util.oneSecond, sysdate) ;
2077     begin
2078       open ruleCursor;
2079       fetch ruleCursor into
2080         ruleTypeOut,
2081         ruleDescriptionOut;
2082       close ruleCursor;
2083       open actionCursor;
2084       fetch actionCursor bulk collect into
2085         actionTypeNamesOut,
2086         actionTypeDescriptionsOut,
2087         actionDescriptionsOut;
2088       close actionCursor;
2089       open conditionCursor(ruleIdIn => ruleIdIn);
2090       fetch conditionCursor bulk collect
2091         into
2092           conditionIdsOut,
2093           conditionDescriptionsOut,
2094           conditionHasLOVsOut;
2095       close conditionCursor;
2096     exception
2097         when others then
2098           ame_util.runtimeException(packageNameIn => 'ame_api3',
2099                                     routineNameIn => 'getRuleDetails3',
2100                                     exceptionNumberIn => sqlcode,
2101                                     exceptionStringIn => sqlerrm);
2102           conditionDescriptionsOut.delete;
2103           conditionIdsOut.delete;
2104           conditionHasLOVsOut.delete;
2105           raise;
2106     end getRuleDetails3;
2107   procedure insertApprover( applicationIdIn in number,
2108                             transactionTypeIn in varchar2,
2109                             transactionIdIn in varchar2,
2110                             approverIn in ame_util.approverRecord2,
2111                             positionIn in number,
2112                             insertionIn in ame_util.insertionRecord2) as
2113     ameApplicationId integer;
2114     absoluteOrder integer;
2115     availableInsertions ame_util.insertionsTable2;
2116     badInsertionTypeException exception;
2117     badStatusException exception;
2118     disallowedAuthException exception;
2119     errorCode integer;
2120     errorMessage ame_util.longStringType;
2121     incompatibleApproverException exception;
2122     insertionOrder integer;
2123     insertionTypeNotFound boolean;
2124     noApproverCategoryException exception;
2125     tempCount integer;
2126     begin
2127       /* Validate input data */
2128       if approverIn.name is null then
2129         raise ambiguousApproverException;
2130       end if;
2131       if insertionIn.item_class is null or
2132          insertionIn.parameter is null then
2133        raise incompatibleApproverException;
2134       end if;
2135       /* Make sure that the approverIn and insertionsIn relate to the same chain */
2136       if (approverIn.item_class <> insertionIn.item_class ) or
2137           (approverIn.item_id <> insertionIn.item_id) or
2138           (approverIn.action_type_id <> insertionIn.action_type_id) or
2139           (approverIn.group_or_chain_id <> insertionIn.group_or_chain_id) or
2140           (approverIn.api_insertion <> insertionIn.api_insertion) or
2141           (approverIn.authority <> insertionIn.authority) then
2142         raise incompatibleApproverException;
2143       end if;
2144       /* Make sure that the approver catgeory is defined correctly for approver */
2145       if (( approverIn.approver_category  is null ) or
2146           ( approverIn.approver_category <> ame_util.approvalApproverCategory and
2147             approverIn.approver_category <> ame_util.fyiApproverCategory)) then
2148         raise noApproverCategoryException;
2149       end if;
2150       /* Handler ame_util.firstApprover order types specially. */
2151       if(insertionIn.order_type = ame_util.firstAuthority) then
2152         ame_api2.setFirstAuthorityApprover(applicationIdIn => applicationIdIn,
2153                                           transactionTypeIn => transactionTypeIn,
2154                                           transactionIdIn => transactionIdIn,
2155                                           approverIn => approverIn,
2156                                           clearChainStatusYNIn => ame_util.booleanFalse);
2157         return;
2158       end if;
2159       /* Make sure approverIn.approval_status is null. */
2160       if(approverIn.approval_status is not null) then
2161         raise badStatusException;
2162       end if;
2163       /* Make sure approverIn.api_insertion is of the right type. */
2164       if(approverIn.api_insertion = ame_util.oamGenerated) then
2165         raise badInsertionTypeException;
2166       end if;
2167       /* Lock Transactions */
2168       ame_engine.lockTransaction(fndApplicationIdIn => applicationIdIn,
2172         Check that only allowed insertion-order and approver-type values are passed, by calling
2169                                  transactionIdIn => transactionIdIn,
2170                                  transactionTypeIdIn => transactionTypeIn);
2171       /*
2173         getAvailableInsertions and comparing values.
2174       */
2175       getAvailableInsertions(applicationIdIn => applicationIdIn,
2176                              transactionTypeIn => transactionTypeIn,
2177                              transactionIdIn => transactionIdIn,
2178                              positionIn => positionIn,
2179                              orderTypeIn =>  insertionIn.order_type,
2180                              availableInsertionsOut => availableInsertions);
2181       tempCount := availableInsertions.count;
2182       insertionTypeNotFound := true;
2183       /* Check if insertionIn is a valid insertion in availableInsertions */
2184       for i in 1 .. tempCount loop
2185         if(availableInsertions(i).order_type = insertionIn.order_type and
2186            availableInsertions(i).parameter = insertionIn.parameter and
2187            availableInsertions(i).api_insertion = insertionIn.api_insertion and
2188            availableInsertions(i).authority = insertionIn.authority) then
2189           insertionTypeNotFound := false;
2190           exit;
2191         end if;
2192       end loop;
2193       if(insertionTypeNotFound) then
2194         raise badInsertionTypeException;
2195       end if;
2196       /* Perform the insertion. */
2197       insertionOrder := ame_engine.getNextInsertionOrder;
2198       ameApplicationId := ame_engine.getAmeApplicationId;
2199       insert into ame_temp_insertions(
2200         transaction_id,
2201         application_id,
2202         insertion_order,
2203         order_type,
2204         parameter,
2205         description,
2206         name,
2207         item_class,
2208         item_id,
2209         approver_category,
2210         api_insertion,
2211         authority,
2212         effective_date,
2213         reason) values(
2214           transactionIdIn,
2215           ameApplicationId,
2216           insertionOrder,
2217           insertionIn.order_type,
2218           insertionIn.parameter,
2219           insertionIn.description,
2220           approverIn.name,
2221           approverIn.item_class,
2222           approverIn.item_id,
2223           approverIn.approver_category,
2224           insertionIn.api_insertion,
2225           insertionIn.authority,
2226           sysdate,
2227           ame_approver_deviation_pkg.insertReason
2228           );
2229       /* Cycle the engine to account for changes in the insertions table. */
2230       ame_engine.updateTransactionState(isTestTransactionIn => false,
2231                                         isLocalTransactionIn => false,
2232                                         fetchConfigVarsIn => true,
2233                                         fetchOldApproversIn => true,
2234                                         fetchInsertionsIn => true,
2235                                         fetchDeletionsIn => true,
2236                                         fetchAttributeValuesIn => true,
2237                                         fetchInactiveAttValuesIn => false,
2238                                         processProductionActionsIn => false,
2239                                         processProductionRulesIn => false,
2240                                         updateCurrentApproverListIn => true,
2241                                         updateOldApproverListIn => true,
2242                                         processPrioritiesIn => true,
2243                                         prepareItemDataIn => false,
2244                                         prepareRuleIdsIn => false,
2245                                         prepareRuleDescsIn => false,
2246                                         transactionIdIn => transactionIdIn,
2247                                         ameApplicationIdIn => null,
2248                                         fndApplicationIdIn => applicationIdIn,
2249                                         transactionTypeIdIn => transactionTypeIn );
2250       ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2251                                    transactionIdIn => transactionIdIn,
2252                                    transactionTypeIdIn => transactionTypeIn);
2253       exception
2254         when ambiguousApproverException then
2255           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2256                                        transactionIdIn => transactionIdIn,
2257                                        transactionTypeIdIn => transactionTypeIn);
2258           errorCode := -20001;
2259           errorMessage :=   ambiguousApproverMessage;
2260           ame_util.runtimeException(packageNameIn => 'ame_api3',
2261                                   routineNameIn => 'insertApprover',
2262                                   exceptionNumberIn => errorCode,
2263                                   exceptionStringIn => errorMessage);
2264           raise_application_error(errorCode,
2265                                   errorMessage);
2266         when badInsertionTypeException then
2267           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2268                                        transactionIdIn => transactionIdIn,
2269                                        transactionTypeIdIn => transactionTypeIn);
2270           errorCode := -20304;
2271           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
2272                                               messageNameIn => 'AME_400240_API_INV_ORDER_TYPE');
2273           ame_util.runtimeException(packageNameIn => 'ame_api3',
2274                                   routineNameIn => 'insertApprover',
2275                                   exceptionNumberIn => errorCode,
2276                                   exceptionStringIn => errorMessage);
2277           raise_application_error(errorCode,
2281                                        transactionIdIn => transactionIdIn,
2278                                   errorMessage);
2279         when badStatusException then
2280           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2282                                        transactionTypeIdIn => transactionTypeIn);
2283           errorCode := -20305;
2284           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
2285                                               messageNameIn => 'AME_400241_API_NON_NULL_INSAPP');
2286           ame_util.runtimeException(packageNameIn => 'ame_api3',
2287                                   routineNameIn => 'insertApprover',
2288                                   exceptionNumberIn => errorCode,
2289                                   exceptionStringIn => errorMessage);
2290           raise_application_error(errorCode,
2291                                   errorMessage);
2292         when incompatibleApproverException then
2293           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2294                                        transactionIdIn => transactionIdIn,
2295                                        transactionTypeIdIn => transactionTypeIn);
2296           errorCode := -20313;
2297           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
2298                                          messageNameIn => 'AME_400446_INCMPTBLE_APPR_INS');
2299           ame_util.runtimeException(packageNameIn => 'ame_api3',
2300                                   routineNameIn => 'insertApprover',
2301                                   exceptionNumberIn => errorCode,
2302                                   exceptionStringIn => errorMessage);
2303           raise_application_error(errorCode,
2304                                   errorMessage);
2305         when noApproverCategoryException then
2306           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2307                                        transactionIdIn => transactionIdIn,
2308                                        transactionTypeIdIn => transactionTypeIn);
2309           errorCode := -20314;
2310           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
2311                                          messageNameIn => 'AME_400447_INVALID_APPR_CATG');
2312           ame_util.runtimeException(packageNameIn => 'ame_api3',
2313                                   routineNameIn => 'insertApprover',
2314                                   exceptionNumberIn => errorCode,
2315                                   exceptionStringIn => errorMessage);
2316           raise_application_error(errorCode,
2317                                   errorMessage);
2318         when others then
2319           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2320                                        transactionIdIn => transactionIdIn,
2321                                        transactionTypeIdIn => transactionTypeIn);
2322           ame_util.runtimeException(packageNameIn => 'ame_api3',
2323                                   routineNameIn => 'insertApprover',
2324                                   exceptionNumberIn => sqlcode,
2325                                   exceptionStringIn => sqlerrm);
2326           raise;
2327   end insertApprover;
2328   procedure parseApproverSource(approverSourceIn in varchar2,
2329                                 sourceDescriptionOut out nocopy varchar2,
2330                                 ruleIdListOut out nocopy ame_util.idList) as
2331   begin
2332     ame_util.parseSourceValue(sourceValueIn => approverSourceIn,
2333                               sourceDescriptionOut => sourceDescriptionOut,
2334                               ruleIdListOut => ruleIdListOut);
2335   end parseApproverSource;
2336 
2337     procedure migrateAnchors(p_applicationIdIn in number,
2338                           p_transactionTypeIn in varchar2,
2339                           p_transactionIdIn in varchar2,
2340                           p_approverIn in ame_util.approverRecord2) is
2341     l_firstAName varchar2(100);
2342     l_order_type varchar2(50);
2343     l_parameter varchar2(3000);
2344     l_parameter_new varchar2(3000);
2345     l_description varchar2(3000);
2346     Type temp_insList is TABLE OF ame_temp_insertions%rowtype index by binary_integer;
2347     anchorList temp_insList;
2348     cursor getAnchor(c_applId in number, c_txnTypeId in varchar2, c_txnId in varchar) is
2349      select *
2350        from ame_temp_insertions
2351       where application_id =
2352         (select application_id
2353           from ame_calling_apps
2354           where sysdate between start_date and nvl(end_date,sysdate)
2355            and transaction_type_id = c_txnTypeId
2356            and fnd_application_id = c_applId)
2357            and transaction_id = c_txnId
2358            and parameter like p_approverIn.name||'%'
2359            order by insertion_order;
2360 
2361     cursor getInvApproverDets(c_applId in number, c_txnTypeId in varchar2, c_txnId in varchar) is
2362       select parameter,
2363              order_type,
2364              description
2365        from ame_temp_insertions
2366       where application_id =
2367         (select application_id
2368            from ame_calling_apps
2369         where sysdate between start_date and nvl(end_date,sysdate)
2370           and transaction_type_id = c_txnTypeId
2371           and fnd_application_id = c_applId)
2372           and transaction_id = c_txnId
2373           and name = p_approverIn.name;
2374     begin
2375      open getAnchor(p_applicationIdIn,p_transactionTypeIn,p_transactionIdIn);
2376      fetch getAnchor bulk collect into anchorList;
2377      close getAnchor;
2378      if anchorList.count > 0 then
2379       open getInvApproverDets(p_applicationIdIn,p_transactionTypeIn,p_transactionIdIn);
2380       fetch getInvApproverDets into l_parameter,l_order_type,l_description;
2381       close getInvApproverDets;
2382 
2383       update ame_temp_insertions
2384          set parameter = l_parameter,
2388          and parameter =  anchorList(1).parameter
2385              order_type = l_order_type,
2386              description = l_description
2387        where name = anchorList(1).name
2389          and item_class =  anchorList(1).item_class
2390          and item_id =  anchorList(1).item_id
2391          and insertion_order =  anchorList(1).insertion_order
2392          and transaction_id = p_transactionIdIn
2393          and application_id =
2394              (select application_id
2395                 from ame_calling_apps
2396                where sysdate between start_date and nvl(end_date,sysdate)
2397                  and transaction_type_id = p_transactionTypeIn
2398                  and fnd_application_id = p_applicationIdIn);
2399      end if;
2400      if anchorList.count > 1 then
2401        for i in 2..anchorList.count loop
2402          l_parameter := anchorList(i).parameter;
2403          l_parameter_new := replace(l_parameter,p_approverIn.name,anchorList(1).name);
2404 
2405         update ame_temp_insertions
2406            set parameter = l_parameter_new
2407          where name = anchorList(i).name
2408            and parameter =  anchorList(i).parameter
2409            and item_class =  anchorList(i).item_class
2410            and item_id =  anchorList(i).item_id
2411            and insertion_order =  anchorList(i).insertion_order
2412            and transaction_id = p_transactionIdIn
2413            and application_id =
2414               (select application_id
2415                  from ame_calling_apps
2416                 where sysdate between start_date and nvl(end_date,sysdate)
2417                   and transaction_type_id = p_transactionTypeIn
2418                   and fnd_application_id = p_applicationIdIn);
2419 
2420        end loop;
2421      end if;
2422     end migrateAnchors;
2423     procedure removeRecursive(nameIn in varchar2
2424                         ,transactionIdIn in varchar2
2425                         ,transactionTypeIn in varchar2
2426                         ,applicationIdIn in number) is
2427      nameList ame_util.stringList;
2428      c_aplId number;
2429      c_transactionType varchar2(100);
2430      c_transactionId varchar2(100);
2431     begin
2432      c_aplId := applicationIdIn;
2433      c_transactionType := transactionTypeIn;
2434      c_transactionId := transactionIdIn;
2435      select name
2436        bulk collect into nameList
2437        from ame_temp_insertions
2438       where application_id =
2439            (select application_id
2440               from ame_calling_apps
2441              where sysdate between start_date and nvl(end_Date,sysdate)
2442                and transaction_type_id = transactionTypeIn
2443                and fnd_application_id = applicationIdIn)
2444        and transaction_id = transactionIdIn
2445        and parameter like nameIn||'%';
2446      if nameList.count > 0 then
2447        for i in 1..nameList.count loop
2448          removeRecursive(nameIn => nameList(i)
2449            ,transactionIdIn => c_transactionId
2450            ,transactionTypeIn => c_transactionType
2451            ,applicationIdIn => c_aplId);
2452        end loop;
2453      end if;
2454      delete from ame_temp_insertions
2455      where parameter like nameIn||'%'
2456        and application_id =
2457         (select application_id
2458           from ame_calling_apps
2459           where sysdate between start_date and nvl(end_Date,sysdate)
2460             and transaction_type_id = transactionTypeIn
2461             and fnd_application_id = applicationIdIn)
2462        and transaction_id = transactionIdIn;
2463     end removeRecursive;
2464     procedure suppressApprover(applicationIdIn in number,
2465                            transactionTypeIn in varchar2,
2466                            transactionIdIn in varchar2,
2467                            approverIn in ame_util.approverRecord2) as
2468     ameApplicationId integer;
2469     approverIndex integer;
2470     approvers ame_util.approversTable2;
2471     allowDeletingOamApprovers ame_util.attributeValueType;
2472     badDeletionException exception;
2473     errorCode integer;
2474     errorMessage ame_util.longStringType;
2475     noMatchException exception;
2476     orderTypeLocation integer;
2477     parameterLocation integer;
2478     ruleIdList ame_util.idList;
2479     sourceDescription ame_util.stringType;
2480     sourceLength integer;
2481     tempOrderType ame_temp_insertions.order_type%type;
2482     tempParameter ame_temp_insertions.parameter%type;
2483     upperLimit integer;
2484     cursor getAnchorInsertions (parameterIn varchar2) is
2485       (select name
2486          from ame_temp_insertions
2487         where application_id = ame_engine.getAmeApplicationId
2488           and transaction_id = transactionIdIn
2489           and parameter = parameterIn);
2490     nameList       ame_util.longStringList;
2491     anchorsExistException exception;
2492     cmpParameter ame_temp_insertions.parameter%type;
2493     anchorName varchar2(320);
2494     anchorList varchar2(1000);
2495     appr_rec_params varchar2(100);
2496     nullApprRecordFieldException Exception;
2497     l_count number;
2498     l_orderType varchar2(50);
2499     begin
2500       ame_engine.lockTransaction(fndApplicationIdIn => applicationIdIn,
2501                                  transactionIdIn => transactionIdIn,
2502                                  transactionTypeIdIn => transactionTypeIn);
2503        appr_rec_params:=null;
2504        if(approverIn.name is null) then
2505          appr_rec_params := 'name ';
2506        end if;
2507        if appr_rec_params is null and
2508           not ame_approver_type_pkg.validateApprover(approverIn.name) then
2509           select count(*)
2510            into l_count
2511            from ame_temp_insertions
2512            where parameter like approverIn.name||'%'
2516               where sysdate between start_date and end_date
2513            and application_id =
2514             (select application_id
2515              from ame_calling_apps
2517               and fnd_application_id = applicationIdIn
2518               and transaction_type_id = transactionTypeIn)
2519            and transaction_id = transactionIdIn;
2520           if l_count > 0 then
2521             select order_type
2522               into l_orderType
2523               from ame_temp_insertions
2524              where transaction_id = transactionIdIn
2525                and application_id =
2526                  (select application_id
2527                    from ame_calling_apps
2528                    where sysdate between start_date and nvl(end_Date,sysdate)
2529                    and transaction_type_id = transactionTypeIn
2530                    and fnd_application_id = applicationIdIn)
2531                and name = approverIn.name;
2532             if l_orderType = ame_util.firstAuthority then
2533               removeRecursive(nameIn => approverIn.name
2534                         ,transactionIdIn => transactionIdIn
2535                         ,transactionTypeIn => transactionTypeIn
2536                         ,applicationIdIn => applicationIdIn);
2537             else
2538              migrateAnchors(applicationIdIn ,
2539                            transactionTypeIn ,
2540                            transactionIdIn ,
2541                            approverIn );
2542             end if;
2543             delete from ame_temp_insertions
2544              where
2545               application_id =  (select application_id
2546                from ame_calling_apps
2547                where sysdate between start_date and end_date
2548                and fnd_application_id = applicationIdIn
2549                and transaction_type_id = transactionTypeIn) and
2550                transaction_id = transactionIdIn and
2551                name = approverIn.name;
2552             ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2553                                    transactionIdIn => transactionIdIn,
2554                                    transactionTypeIdIn => transactionTypeIn);
2555             return;
2556           end if;
2557        end if;
2558        if approverIn.item_class is null then
2559          appr_rec_params := appr_rec_params || ', item_class ';
2560        end if;
2561        if approverIn.item_id is null then
2562          appr_rec_params := appr_rec_params || ', item_id ';
2563        end if;
2564        if approverIn.action_type_id is null then
2565          appr_rec_params := appr_rec_params || ', action_type_id ';
2566        end if;
2567        if approverIn.group_or_chain_id is null then
2568          appr_rec_params := appr_rec_params || ', group_or_chain_id ';
2569        end if;
2570        if appr_rec_params is not null then
2571                raise nullApprRecordFieldException;
2572        end if;
2573       ame_engine.updateTransactionState(isTestTransactionIn => false,
2574                                         isLocalTransactionIn => false,
2575                                         fetchConfigVarsIn => true,
2576                                         fetchOldApproversIn => true,
2577                                         fetchInsertionsIn => true,
2578                                         fetchDeletionsIn => true,
2579                                         fetchAttributeValuesIn => true,
2580                                         fetchInactiveAttValuesIn => false,
2581                                         processProductionActionsIn => false,
2582                                         processProductionRulesIn => false,
2583                                         updateCurrentApproverListIn => true,
2584                                         updateOldApproverListIn => false,
2585                                         processPrioritiesIn => true,
2586                                         prepareItemDataIn => false,
2587                                         prepareRuleIdsIn => false,
2588                                         prepareRuleDescsIn => false,
2589                                         transactionIdIn => transactionIdIn,
2590                                         ameApplicationIdIn => null,
2591                                         fndApplicationIdIn => applicationIdIn,
2592                                         transactionTypeIdIn => transactionTypeIn );
2593       /* Try to match the approver. */
2594       ame_engine.getApprovers(approversOut => approvers);
2595       upperLimit := approvers.count;
2596       approverIndex := null;
2597       for i in 1 .. upperLimit loop
2598         if((approvers(i).approval_status is null or
2599             approvers(i).approval_status in
2600               (ame_util.exceptionStatus,
2601                ame_util.noResponseStatus,
2602                ame_util.notifiedStatus,
2603                ame_util.rejectStatus)) and
2604             ame_engine.approversMatch(approverRecord1In => approverIn,
2605                                       approverRecord2In => approvers(i))) then
2606           approverIndex := i;
2607           if approvers(approverIndex).api_insertion = ame_util.apiInsertion then
2608             anchorName := approvers(i).name;
2609             cmpParameter := approvers(i).name ||
2610                             ame_util.fieldDelimiter ||
2611                             approvers(i).item_class ||
2612                             ame_util.fieldDelimiter ||
2613                             approvers(i).item_id ||
2614                             ame_util.fieldDelimiter ||
2615                             approvers(i).action_type_id ||
2616                             ame_util.fieldDelimiter ||
2617                             approvers(i).group_or_chain_id ||
2618                             ame_util.fieldDelimiter ||
2619                             approvers(i).occurrence;
2620             open getAnchorInsertions(cmpParameter);
2621             fetch getAnchorInsertions bulk collect into nameList;
2625             end if;
2622             if nameList.count > 0 then
2623               close getAnchorInsertions;
2624               raise anchorsExistException;
2626             close getAnchorInsertions;
2627           end if;
2628           exit;
2629         end if;
2630       end loop;
2631       -- If there is no match, raise an exception.
2632       if(approverIndex is null) then
2633         raise noMatchException;
2634       end if;
2635       ameApplicationId := ame_engine.getAmeApplicationId;
2636       -- parse the source to see if the approver was inserted.
2637       ame_util.parseSourceValue(sourceValueIn => approvers(approverIndex).source,
2638                                 sourceDescriptionOut => sourceDescription,
2639                                 ruleIdListOut => ruleIdList);
2640       -- If the approver was inserted, delete the approver from ame_temp_insertions.
2641       -- If the approver was OAM generated, check whether deleting OAM-generated approvers
2642       -- is allowed.  If so, record the deletion.
2643       --
2644       if(approvers(approverIndex).api_insertion = ame_util.oamGenerated or
2645          sourceDescription = ame_util.ruleGeneratedSource or
2646          sourceDescription = ame_util.surrogateSource)  then
2647         allowDeletingOamApprovers :=
2648           ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.allowDeletingOamApprovers);
2649         if(allowDeletingOamApprovers <> ame_util.booleanAttributeTrue) then
2650                                   raise badDeletionException;
2651         end if;
2652         insert into ame_temp_deletions(
2653           transaction_id,
2654           application_id,
2655           name,
2656           item_class,
2657           item_id,
2658           approver_category,
2659           action_type_id,
2660           group_or_chain_id,
2661           occurrence,
2662           effective_date,
2663           reason) values(
2664             transactionIdIn,
2665             ameApplicationId,
2666             approvers(approverIndex).name,
2667             approvers(approverIndex).item_class,
2668             approvers(approverIndex).item_id,
2669             approvers(approverIndex).approver_category,
2670             approvers(approverIndex).action_type_id,
2671             approvers(approverIndex).group_or_chain_id,
2672             approvers(approverIndex).occurrence,
2673             sysdate,
2674             ame_approver_deviation_pkg.suppressReason
2675             );
2676       else
2677         for i in 1 .. approvers.count loop
2678           if approvers(i).name = approverIn.name and
2679              approvers(i).item_class = approverIn.item_class and
2680              approvers(i).item_id = approverIn.item_id then
2681             ame_engine.updateInsertions(indexIn => i);
2682           end if;
2683         end loop;
2684         delete from ame_temp_insertions
2685           where
2686             application_id = ameApplicationId and
2687             transaction_id = transactionIdIn and
2688             name = approvers(approverIndex).name and
2689             item_class = approvers(approverIndex).item_class and
2690             item_id = approvers(approverIndex).item_id ;
2691       end if;
2692       -- Cycle the engine to account for changes in the deletions table.
2693       ame_engine.updateTransactionState(isTestTransactionIn => false,
2694                                         isLocalTransactionIn => false,
2695                                         fetchConfigVarsIn => true,
2696                                         fetchOldApproversIn => true,
2697                                         fetchInsertionsIn => true,
2698                                         fetchDeletionsIn => true,
2699                                         fetchAttributeValuesIn => true,
2700                                         fetchInactiveAttValuesIn => false,
2701                                         processProductionActionsIn => false,
2702                                         processProductionRulesIn => false,
2703                                         updateCurrentApproverListIn => true,
2704                                         updateOldApproverListIn => true,
2705                                         processPrioritiesIn => true,
2706                                         prepareItemDataIn => false,
2707                                         prepareRuleIdsIn => false,
2708                                         prepareRuleDescsIn => false,
2709                                         transactionIdIn => transactionIdIn,
2710                                         ameApplicationIdIn => null,
2711                                         fndApplicationIdIn => applicationIdIn,
2712                                         transactionTypeIdIn => transactionTypeIn );
2713       ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2714                                    transactionIdIn => transactionIdIn,
2715                                    transactionTypeIdIn => transactionTypeIn);
2716     exception
2717       when anchorsExistException then
2718           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2719                                        transactionIdIn => transactionIdIn,
2720                                        transactionTypeIdIn => transactionTypeIn);
2721           anchorList := '';
2722           for i in 1 .. nameList.count loop
2723             anchorList := anchorList || ame_approver_type_pkg.getApproverDescription(nameList(i));
2724             if i <> nameList.count then
2725               anchorList := anchorList || '; ';
2726             end if;
2727           end loop;
2728           errorCode := -20001;
2729           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
2730                                               messageNameIn => 'AME_400651_ANCHORS_EXIST',
2731                                               tokenNameOneIn => 'APPROVER',
2732                                               tokenValueOneIn => ame_approver_type_pkg.getApproverDescription(anchorName),
2733                                               tokenNameTwoIn => 'ANCHORED_APPROVERS',
2734                                               tokenValueTwoIn => anchorList);
2735           ame_util.runtimeException(packageNameIn => 'ame_api3',
2736                                     routineNameIn => 'suppressApprover',
2737                                     exceptionNumberIn => errorCode,
2738                                     exceptionStringIn => errorMessage);
2739           raise_application_error(errorCode,
2740                                   errorMessage);
2741       when nullApprRecordFieldException then
2742           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2743                                        transactionIdIn => transactionIdIn,
2744                                        transactionTypeIdIn => transactionTypeIn);
2745           errorCode := -20320;
2746           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
2747                                               messageNameIn => 'AME_400814_NULL_SUPPR_APPR_FLD',
2748                                               tokenNameOneIn => 'APPROVER_REC_PARAMS',
2749                                               tokenValueOneIn=>appr_rec_params);
2750           ame_util.runtimeException(packageNameIn => 'ame_api3',
2751                                     routineNameIn => 'suppressApprover',
2752                                     exceptionNumberIn => errorCode,
2753                                     exceptionStringIn => errorMessage);
2754           raise_application_error(errorCode,
2755                                   errorMessage);
2756       when badDeletionException then
2757           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2758                                        transactionIdIn => transactionIdIn,
2759                                        transactionTypeIdIn => transactionTypeIn);
2760           errorCode := -20301;
2761           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
2762                                               messageNameIn => 'AME_400236_API_ADRGA_TRUE');
2763           ame_util.runtimeException(packageNameIn => 'ame_api3',
2764                                     routineNameIn => 'suppressApprover',
2765                                     exceptionNumberIn => errorCode,
2766                                     exceptionStringIn => errorMessage);
2767           raise_application_error(errorCode,
2768                                   errorMessage);
2769       when noMatchException then
2770           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2771                                        transactionIdIn => transactionIdIn,
2772                                        transactionTypeIdIn => transactionTypeIn);
2773           errorCode := -20302;
2774           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
2775                                               messageNameIn => 'AME_400237_API_NO MATCH_APPR');
2776           ame_util.runtimeException(packageNameIn => 'ame_api3',
2777                                     routineNameIn => 'suppressApprover',
2778                                     exceptionNumberIn => errorCode,
2779                                     exceptionStringIn => errorMessage);
2780           raise_application_error(errorCode,
2781                                   errorMessage);
2782       when others then
2783           ame_engine.unlockTransaction(fndApplicationIdIn => applicationIdIn,
2784                                        transactionIdIn => transactionIdIn,
2785                                        transactionTypeIdIn => transactionTypeIn);
2786           ame_util.runtimeException(packageNameIn => 'ame_api3',
2787                                     routineNameIn => 'suppressApprover',
2788                                     exceptionNumberIn => sqlcode,
2789                                     exceptionStringIn => sqlerrm);
2790          raise;
2791     end suppressApprover;
2792   procedure suppressApprovers(applicationIdIn in integer,
2793                             transactionTypeIn in varchar2,
2794                             transactionIdIn in varchar2,
2795                             approversIn in ame_util.approversTable2) as
2796     currentApproverInIndex integer;
2797     lastApproverInIndex integer;
2798     nextApproverInIndex integer;
2799     begin
2800       lastApproverInIndex := approversIn.last;
2801       currentApproverInIndex := approversIn.first;
2802       --
2803       -- This procedure should always depend on suppressApprovers, so that we don't need to repeat its
2804       -- error-checking logic here.
2805       --
2806       loop
2807         suppressApprover(applicationIdIn => applicationIdIn,
2808                        transactionIdIn => transactionIdIn,
2809                        approverIn => approversIn(currentApproverInIndex),
2810                        transactionTypeIn => transactionTypeIn);
2811         if(currentApproverInIndex = lastApproverInIndex) then
2812           exit;
2813         end if;
2814         currentApproverInIndex := approversIn.next(currentApproverInIndex);
2815       end loop;
2816     exception
2817         when others then
2818           ame_util.runtimeException(packageNameIn => 'ame_api3',
2819                                     routineNameIn => 'suppressApprovers',
2820                                     exceptionNumberIn => sqlcode,
2821                                     exceptionStringIn => sqlerrm);
2822           raise;
2823   end suppressApprovers;
2824 end ame_api3;