DBA Data[Home] [Help]

PACKAGE BODY: APPS.AME_API

Source


1 package body ame_api as
2 /* $Header: ameeapin.pkb 120.9.12000000.3 2007/07/23 08:19:51 prasashe noship $ */
3   /*check11510 checks backward compatibility of 11510 code with 1159 implementation
4     by checking if parallelization is induced in the AME setup*/
5    procedure check11510(applicationIdIn   in integer,
6                         transactionTypeIn in varchar2 default null);
7   /* functions */
8   function getRuleDescription(ruleIdIn in varchar2) return varchar2 as
9     begin
10       return(ame_api3.getRuleDescription(ruleIdIn => ruleIdIn));
11       exception
12         when others then
13           ame_util.runtimeException(packageNameIn => 'ame_api',
14                                     routineNameIn => 'getRuleDescription',
15                                     exceptionNumberIn => sqlcode,
16                                     exceptionStringIn => sqlerrm);
17           raise;
18           return(null);
19     end getRuleDescription;
20   function validateApprover(approverIn in ame_util.approverRecord) return boolean as
21     approver ame_util.approverRecord2;
22     begin
23       ame_util.apprRecordToApprRecord2(approverRecordIn => approverIn,
24                               itemIdIn=> null,
25                               approverRecord2Out =>approver);
26       if approver.name is null then
27         return(false);
28       else
29         return(ame_api2.validateApprover(approverIn=>approver));
30       end if;
31       exception
32         when others then
33           ame_util.runtimeException(packageNameIn => 'ame_api',
34                                     routineNameIn => 'validateApprover',
35                                     exceptionNumberIn => sqlcode,
36                                     exceptionStringIn => sqlerrm);
37           raise;
38           return(false);
39     end validateApprover;
40   /* procedures */
41   /*check 11510*/
42   procedure check11510(applicationIdIn   in integer,
43                        transactionTypeIn in varchar2 default null) as
44     tempChar                      varchar2(1);
45     tempNum                       number;
46     parallelizationFoundException exception;
47     ameApplicationId              integer;
48     errorCode integer;
49     errorMessage ame_util.longestStringType;
50     itemClassId                   number;
51     tempAMEObject                 varchar2(100);
52     --+
53     cursor chkItemClassNonSerialPar(applicationIdIn in number,
54                                     itemClassIdIn   in number) is
55       select 'Y'
56          from ame_item_class_usages
57          where application_id = applicationIdIn
58            and item_class_id = itemClassIdIn
59            and item_class_sublist_mode <> ame_util.serialSublists
60            and sysdate between start_date and
61                  nvl(end_date - ame_util.oneSecond, sysdate);
62     --+
63     cursor chkItemClassNonUniqueOrder(applicationIdIn in number) is
64       select 'Y'
65         from (select (count(item_class_order_number) - count(distinct item_class_order_number)) uniq
66                  from ame_item_class_usages
67                  where application_id = applicationIdIn
68                    and sysdate between start_date and
69                          nvl(end_date - ame_util.oneSecond, sysdate)
70                )
71         where uniq <> 0;
72     --+
73     cursor chkActionTypeNonSerialPar(applicationIdIn in number) is
74       select 'Y'
75         from ame_action_type_config
76         where application_id = applicationIdIn
77           and (chain_ordering_mode <> ame_util.serialChainsMode
78                or ( voting_regime is not null and
79                     voting_regime <> ame_util.serializedVoting
80                   )
81               )
82           and sysdate between start_date and
83                 nvl(end_date - ame_util.oneSecond, sysdate);
84     --+
85     cursor chkActionTypeNonUniqueOrder(applicationIdIn in number) is
86       select 'Y'
87         from (select distinct (count(order_number) - count(distinct order_number)) uniq
88                 from ame_action_type_config acf,
89                      ame_action_type_usages axu
90                 where acf.application_id = applicationIdIn
91                   and acf.action_type_id = axu.action_type_id
92                   and sysdate between acf.start_date and
93                         nvl(acf.end_Date - ame_util.oneSecond, sysdate)
94                   and sysdate between axu.start_date and
95                         nvl(axu.end_Date - ame_util.oneSecond, sysdate)
96                 group by rule_type
97               )
98         where uniq <> 0;
99     --+
100     cursor chkApprovalGrpNonSerialPar(applicationIdIn in number) is
101       select 'Y'
102         from ame_approval_group_config
103         where application_id = applicationIdIn
104           and (voting_regime = ame_util.consensusVoting
105                or voting_regime = ame_util.firstApproverVoting)
106           and sysdate between start_date and
107                 nvl(end_date - ame_util.oneSecond, sysdate);
108     --+
109     cursor chkApprovalGrpNonUniqueOrder(applicationIdIn in number) is
110       select 'Y'
111         from (select (count(order_number) - count(distinct order_number)) uniq
112                 from ame_approval_group_config
113                 where application_id = applicationIdIn
114                   and sysdate between start_date and
115                         nvl(end_date - ame_util.oneSecond, sysdate)
116              )
117          where uniq <> 0;
118     --+
119     cursor chkApprovalGrpMemberOrder(applicationIdIn in number) is
120       select gpi.approval_group_id group_id
121         from ame_approval_groups apg,
122              ame_approval_group_config gcf,
123              ame_approval_group_items gpi
124         where apg.is_static = ame_util.booleanTrue
125           and gcf.application_id = applicationIdIn
126           and gcf.approval_group_id = apg.approval_group_id
127           and gcf.voting_regime = ame_util.orderNumberVoting
128           and gpi.approval_group_id = apg.approval_group_id
129           and sysdate between apg.start_date and
130                 nvl(apg.end_date - ame_util.oneSecond, sysdate)
131           and sysdate between gcf.start_date and
132                 nvl(gcf.end_date - ame_util.oneSecond, sysdate)
133           and sysdate between gpi.start_date and
134                 nvl(gpi.end_date - ame_util.oneSecond, sysdate)
135         group by(gpi.approval_group_id)
136           having (count(gpi.order_number) - count(distinct gpi.order_number)) <> 0;
137      --+
138      cursor chkGrpActionInCurrentTxn(groupIdIn in varchar2
139                                      ,ameApplicationIdIn in number) is
140         select 'Y'
141           from ame_actions act,
142                ame_action_usages acu,
143                ame_rule_usages aru
144          where acu.rule_id = aru.rule_id
145            and act.action_id = acu.action_id
146            and act.parameter = groupIdIn
147            and aru.item_id = ameApplicationIdIn
148            and sysdate between act.start_date and nvl(act.end_Date - (1/86400), sysdate)
149            and ((sysdate between acu.start_date and nvl(acu.end_date - (1/86400),sysdate))
150                 or
151                (sysdate < acu.start_date and acu.start_date < nvl(acu.end_date, acu.start_date + (1/86400))))
152            and ((sysdate between aru.start_date and nvl(aru.end_date - (1/86400),sysdate))
153                 or
154                (sysdate < aru.start_date and aru.start_date < nvl(aru.end_date, aru.start_date + (1/86400))));
155   --+
156   begin
157   --+
158       ameApplicationId := ame_admin_pkg.getApplicationId(fndAppIdIn => applicationIdIn,
159                                                          transactionTypeIdIn => transactionTypeIn);
160     --Check if parallelization is induced into ame_item_class_usages
161     --by checking the columns item_class_sublist_mod for HEADER item class only.
162     --Do not check item_class_par_mode for header item class since it will always have 1 item.
163     --Do not check usages for other item classes since we throw error if allowAllItemClasses
164     --is true in one of the checks below.
165     --+
166     itemClassId := ame_admin_pkg.getItemClassIdByName(ame_util.headerItemClassName);
167     tempAMEObject := 'Item class non serail mode';
168     open chkItemClassNonSerialPar(applicationIdIn => ameApplicationId,
169                                   itemClassIdIn   => itemClassId);
170     fetch chkItemClassNonSerialPar into tempChar;
171     if(chkItemClassNonSerialPar%FOUND) then
172       close chkItemClassNonSerialPar;
173       raise parallelizationFoundException;
174     end if;
175     close chkItemClassNonSerialPar;
176     --Check if parallelization is induced into ame_item_class_usages
177     --by ensuring that no two item classes have same order number.
178     --+
179     tempAMEObject := 'Item class non unique order number';
180     open chkItemClassNonUniqueOrder(applicationIdIn => ameApplicationId);
181     fetch chkItemClassNonUniqueOrder into tempChar;
182     if(chkItemClassNonUniqueOrder%FOUND) then
183       close chkItemClassNonUniqueOrder;
184       raise parallelizationFoundException;
185     end if;
186     close chkItemClassNonUniqueOrder;
187     --+
188     --Check if parallelization is induced into ame_action_type_config
189     --by checking the columns chain_ordering_mode and voting_regime.
190     --Throw error if any of them has non serial value.
191     --+
192     tempAMEObject := 'Action type non serail mode';
193     open chkActionTypeNonSerialPar(applicationIdIn => ameApplicationId);
194     fetch chkActionTypeNonSerialPar into tempChar;
195     if(chkActionTypeNonSerialPar%FOUND) then
196       close chkActionTypeNonSerialPar;
197       raise parallelizationFoundException;
198     end if;
199     close chkActionTypeNonSerialPar;
200     --+
201     --Check if parallelization is induced into ame_action_type_config
202     --by ensuring that no two action types belonging to a rule type
203     --have same order number.
204     --+
205     tempAMEObject := 'Action type non serial order number';
206     open chkActionTypeNonUniqueOrder(applicationIdIn => ameApplicationId);
207     fetch chkActionTypeNonUniqueOrder into tempChar;
208     if(chkActionTypeNonUniqueOrder%FOUND) then
209       close chkActionTypeNonUniqueOrder;
210       raise parallelizationFoundException;
211     end if;
212     close chkActionTypeNonUniqueOrder;
213     --+
214     --Check if parallelization is induced into ame_approval_group_config
215     --by checking voting regime for consensus and first responder wins.
216     --Do not throw error for voting regime = order number since it will
217     --be taken care by one of the checks below.
218     --+
219     tempAMEObject := 'Approval group non serail mode';
220     open chkApprovalGrpNonSerialPar(applicationIdIn => ameApplicationId);
221     fetch chkApprovalGrpNonSerialPar into tempChar;
222     if(chkApprovalGrpNonSerialPar%FOUND) then
223       close chkApprovalGrpNonSerialPar;
224       raise parallelizationFoundException;
225     end if;
226     close chkApprovalGrpNonSerialPar;
227     --+
228     --Check if parallelization is induced into ame_approval_group_config
229     --by ensuring that no two approval groups have same order number.
230     --+
231     tempAMEObject := 'approval group: non unique order number';
232     open chkApprovalGrpNonUniqueOrder(applicationIdIn => ameApplicationId);
233     fetch chkApprovalGrpNonUniqueOrder into tempChar;
234     if(chkApprovalGrpNonUniqueOrder%FOUND) then
235       close chkApprovalGrpNonUniqueOrder;
236       raise parallelizationFoundException;
237     end if;
238     close chkApprovalGrpNonUniqueOrder;
239     --+
240     --Check if parallelization is induced by checking all static approval
241     --groups used in the current transaction type with voting_regime = order number
242     --and ensuring that these groups' items have unique order numbers.
243     --+
244     for x in chkApprovalGrpMemberOrder(ameApplicationId) loop
245       open chkGrpActionInCurrentTxn(groupIdIn => x.group_id
246                                    ,ameApplicationIdIn => ameApplicationId);
247       tempAMEObject := 'Approval group member non unique member order number:'||x.group_id;
248       fetch chkGrpActionInCurrentTxn into tempChar;
249       if(chkGrpActionInCurrentTxn%FOUND) then
250         close chkGrpActionInCurrentTxn;
251         raise parallelizationFoundException;
252       end if;
253       close chkGrpActionInCurrentTxn;
254     end loop;
255     --+
256     --The following checks ensure that allowAllItemClasses, allowAllItemClassRules,
257     --allowAllApproverTypes, productionFunctionality are turned off.
258     --+
259     tempAMEObject := 'AME config vars, allowAllRuleConfigvar';
260     if(ame_util.getConfigVar(variableNameIn  => ame_util.allowAllICRulesConfigVar,
261                              applicationIdIn => ameApplicationId)
262         = ame_util.yes) then
263       raise parallelizationFoundException;
264     end if;
265     --+
266     tempAMEObject := 'AME config vars, fyi notification';
267     if(ame_util.getConfigVar(variableNameIn  => ame_util.allowFyiNotificationsConfigVar,
268                              applicationIdIn => ameApplicationId)
269         = ame_util.yes) then
270       raise parallelizationFoundException;
271     end if;
272     --+
273     tempAMEObject := 'AME config vars allow all approver types';
274     if(ame_util.getConfigVar(variableNameIn  => ame_util.allowAllApproverTypesConfigVar,
275                              applicationIdIn => ameApplicationId)
276         = ame_util.yes) then
277       raise parallelizationFoundException;
278     end if;
279     --+
280     tempAMEObject := 'AME config vars, production rules';
281     if(ame_util.getConfigVar(variableNameIn  => ame_util.productionConfigVar,
282                              applicationIdIn => ameApplicationId)
283         <> ame_util.noProductions) then
284       raise parallelizationFoundException;
285     end if;
286     --+
287   exception
288         when parallelizationFoundException then
289           errorCode := -20001;
290           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
291                                               messageNameIn => 'AME_400679_API_PARALLEL_CONFIG');
292           ame_util.runtimeException(packageNameIn => 'ame_api',
293                                     routineNameIn => 'check11510',
294                                     exceptionNumberIn => errorCode,
295                                     exceptionStringIn => 'ameApplicationId:'||ameApplicationId||
296                                     ':'||tempAMEObject||':'||errorMessage);
297           raise_application_error(errorCode,
298                                   errorMessage);
299         when others then
300           ame_util.runtimeException(packageNameIn => 'ame_api',
301                                     routineNameIn => 'check11510',
302                                     exceptionNumberIn => sqlcode,
303                                     exceptionStringIn => sqlerrm);
304           raise;
305   end check11510;
306   procedure clearAllApprovals(applicationIdIn in integer,
307                               transactionIdIn in varchar2,
308                               transactionTypeIn in varchar2 default null) as
309     begin
310       check11510(applicationIdIn   => applicationIdIn,
311                  transactionTypeIn => transactionTypeIn);
312       ame_api2.clearAllApprovals(applicationIdIn => applicationIdIn,
313                                  transactionIdIn => transactionIdIn,
314                                  transactionTypeIn => transactionTypeIn);
315     exception
316       when others then
317         ame_util.runtimeException(packageNameIn => 'ame_api',
318                                   routineNameIn => 'clearAllApprovals',
319                                   exceptionNumberIn => sqlcode,
320                                   exceptionStringIn => sqlerrm);
321         raise;
322     end clearAllApprovals;
323   procedure clearDeletion(approverIn in ame_util.approverRecord,
324                           applicationIdIn in integer,
325                           transactionIdIn in varchar2,
326                           transactionTypeIn in varchar2 default null) as
327     approver ame_util.approverRecord2;
328     begin
329       check11510(applicationIdIn   => applicationIdIn,
330                  transactionTypeIn => transactionTypeIn);
331       ame_util.apprRecordToApprRecord2(approverRecordIn => approverIn,
332                               itemIdIn => transactionIdIn,
333                               approverRecord2Out =>approver);
334       ame_api3.clearSuppression(approverIn => approver,
335                              applicationIdIn => applicationIdIn,
336                              transactionIdIn => transactionIdIn,
337                              transactionTypeIn => transactionTypeIn);
338       exception
339         when others then
340           ame_util.runtimeException(packageNameIn => 'ame_api',
341                                     routineNameIn => 'clearDeletion',
342                                     exceptionNumberIn => sqlcode,
343                                     exceptionStringIn => sqlerrm);
344           raise;
345     end clearDeletion;
346   procedure clearDeletions(applicationIdIn in integer,
347                            transactionIdIn in varchar2,
348                            transactionTypeIn in varchar2 default null) as
349     begin
350       check11510(applicationIdIn   => applicationIdIn,
351                  transactionTypeIn => transactionTypeIn);
352       ame_api3.clearSuppressions(applicationIdIn => applicationIdIn,
353                               transactionIdIn => transactionIdIn,
354                               transactionTypeIn => transactionTypeIn);
355     exception
356       when others then
357         ame_util.runtimeException(packageNameIn => 'ame_api',
358                                   routineNameIn => 'clearDeletions',
359                                   exceptionNumberIn => sqlcode,
360                                   exceptionStringIn => sqlerrm);
361         raise;
362     end clearDeletions;
363   procedure clearInsertion(approverIn in ame_util.approverRecord,
364                            applicationIdIn in integer,
365                            transactionIdIn in varchar2,
366                            transactionTypeIn in varchar2 default null) as
367     approver ame_util.approverRecord2;
368     begin
369       check11510(applicationIdIn   => applicationIdIn,
370                  transactionTypeIn => transactionTypeIn);
371       ame_util.apprRecordToApprRecord2(approverRecordIn => approverIn,
372                               itemIdIn => transactionIdIn,
373                               approverRecord2Out =>approver);
374       ame_api3.clearInsertion(approverIn => approver,
375                               applicationIdIn => applicationIdIn,
376                               transactionIdIn => transactionIdIn,
377                               transactionTypeIn => transactionTypeIn);
378       exception
379         when others then
380           ame_util.runtimeException(packageNameIn => 'ame_api',
381                                     routineNameIn => 'clearInsertion',
382                                     exceptionNumberIn => sqlcode,
383                                     exceptionStringIn => sqlerrm);
384           raise;
385     end clearInsertion;
386   procedure clearInsertions(applicationIdIn in integer,
387                             transactionIdIn in varchar2,
388                             transactionTypeIn in varchar2 default null) as
389     begin
390       check11510(applicationIdIn   => applicationIdIn,
391                  transactionTypeIn => transactionTypeIn);
392       ame_api3.clearInsertions( applicationIdIn => applicationIdIn,
393                               transactionIdIn => transactionIdIn,
394                               transactionTypeIn => transactionTypeIn);
395     exception
396       when others then
397         ame_util.runtimeException(packageNameIn => 'ame_api',
398                                   routineNameIn => 'clearInsertions',
399                                   exceptionNumberIn => sqlcode,
400                                   exceptionStringIn => sqlerrm);
401         raise;
402     end clearInsertions;
403   procedure deleteApprover(applicationIdIn in integer,
404                            transactionIdIn in varchar2,
405                            approverIn in ame_util.approverRecord,
406                            transactionTypeIn in varchar2 default null) as
407     approver ame_util.approverRecord2;
408     approvers ame_util.approversTable2;
409     approverIndex integer;
410     errorCode integer;
411     errorMessage ame_util.longStringType;
412     noMatchException exception;
413     begin
414       check11510(applicationIdIn   => applicationIdIn,
415                  transactionTypeIn => transactionTypeIn);
416       ame_util.apprRecordToApprRecord2(approverRecordIn => approverIn,
417                               itemIdIn => transactionIdIn,
418                               approverRecord2Out =>approver);
419       if (approver.action_type_id is null or
420           approver.group_or_chain_id is null or
421           approver.occurrence is null) then
422         /* run the engine cycle to get the latest approver list and then iterate thru
423            the list to find the first approver which matches this one. Populate this
424            approvers action_type_id and group_or_chain_id */
425         ame_engine.updateTransactionState(isTestTransactionIn => false,
426                                         isLocalTransactionIn => false,
427                                         fetchConfigVarsIn => true,
428                                         fetchOldApproversIn => true,
429                                         fetchInsertionsIn => true,
430                                         fetchDeletionsIn => true,
431                                         fetchAttributeValuesIn => true,
432                                         fetchInactiveAttValuesIn => false,
433                                         processProductionActionsIn => false,
434                                         processProductionRulesIn => false,
435                                         updateCurrentApproverListIn => true,
436                                         updateOldApproverListIn => false,
437                                         processPrioritiesIn => true,
438                                         prepareItemDataIn => false,
439                                         prepareRuleIdsIn => false,
440                                         prepareRuleDescsIn => false,
441                                         transactionIdIn => transactionIdIn,
442                                         ameApplicationIdIn => null,
443                                         fndApplicationIdIn => applicationIdIn,
444                                         transactionTypeIdIn => transactionTypeIn );
445         /* Fetch the approver list */
446         ame_engine.getApprovers(approversOut => approvers);
447         approverIndex := null;
448         for i in 1 .. approvers.count loop
449           if((approvers(i).approval_status is null or
450               approvers(i).approval_status in
451                  (ame_util.exceptionStatus,
452                   ame_util.notifiedStatus,
453                   ame_util.noResponseStatus,
454                   ame_util.rejectStatus)) and
455             approver.name = approvers(i).name) then
456             approverIndex := i;
457             exit;
458           end if;
459         end loop;
460         approver.action_type_id := approvers(approverIndex).action_type_id;
461         approver.group_or_chain_id := approvers(approverIndex).group_or_chain_id;
462         approver.occurrence := approvers(approverIndex).occurrence;
463         /* If there is no match, raise an exception. */
464         if(approverIndex is null) then
465           raise noMatchException;
466         end if;
467       end if;
468       ame_api3.suppressApprover(applicationIdIn => applicationIdIn,
469                               transactionIdIn => transactionIdIn,
470                               approverIn => approver,
471                               transactionTypeIn => transactionTypeIn);
472       exception
473         when noMatchException then
474           errorCode := -20001;
475           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
476                                               messageNameIn => 'AME_400237_API_NO MATCH_APPR');
477           ame_util.runtimeException(packageNameIn => 'ame_api',
478                                     routineNameIn => 'deleteApprover',
479                                     exceptionNumberIn => errorCode,
480                                     exceptionStringIn => errorMessage);
481           raise_application_error(errorCode,
482                                   errorMessage);
483         when others then
484           ame_util.runtimeException(packageNameIn => 'ame_api',
485                                     routineNameIn => 'deleteApprover',
486                                     exceptionNumberIn => sqlcode,
487                                     exceptionStringIn => sqlerrm);
488           raise;
489     end deleteApprover;
490   procedure deleteApprovers(applicationIdIn in integer,
491                             transactionIdIn in varchar2,
492                             approversIn in ame_util.approversTable,
493                             transactionTypeIn in varchar2 default null) as
494     currentApproverInIndex integer;
495     lastApproverInIndex integer;
496     nextApproverInIndex integer;
497     begin
498       check11510(applicationIdIn   => applicationIdIn,
499                  transactionTypeIn => transactionTypeIn);
500       lastApproverInIndex := approversIn.last;
501       currentApproverInIndex := approversIn.first;
502       --
503       -- This procedure should always depend on deleteApprover, so that we don't
504       -- need to repeat error-checking and other logic here.
505       --
506       loop
507         ame_api.deleteApprover(applicationIdIn => applicationIdIn,
508                        transactionIdIn => transactionIdIn,
509                        approverIn => approversIn(currentApproverInIndex),
510                        transactionTypeIn => transactionTypeIn);
511         if(currentApproverInIndex = lastApproverInIndex) then
512           exit;
513         end if;
514         currentApproverInIndex := approversIn.next(currentApproverInIndex);
515       end loop;
516     exception
517       when others then
518         ame_util.runtimeException(packageNameIn => 'ame_api',
519                                   routineNameIn => 'deleteApprovers',
520                                   exceptionNumberIn => sqlcode,
521                                   exceptionStringIn => sqlerrm);
522         raise;
523     end deleteApprovers;
524   procedure getAdminApprover(applicationIdIn in integer default null,
525                              transactionTypeIn in varchar2 default null,
526                              adminApproverOut out nocopy ame_util.approverRecord) as
527     adminApprover ame_util.approverRecord2;
528     begin
529       ame_api2.getAdminApprover(applicationIdIn => applicationIdIn,
530                                 transactionTypeIn => transactionTypeIn,
531                                 adminApproverOut => adminApprover);
532       if adminApprover.name is null then
533         return;
534       else
535         ame_util.apprRecord2ToApprRecord(approverRecord2In => adminApprover,
536                                          approverRecordOut => adminApproverOut);
537       end if;
538       exception
539         when others then
540           ame_util.runtimeException(packageNameIn => 'ame_api',
541                                     routineNameIn => 'getAdminApprover',
542                                     exceptionNumberIn => sqlcode,
543                                     exceptionStringIn => sqlerrm);
544           raise;
545     end getAdminApprover;
546   procedure getAllApprovers(applicationIdIn in integer,
547                             transactionIdIn in varchar2,
548                             transactionTypeIn in varchar2 default null,
549                             approversOut out nocopy ame_util.approversTable) as
550     approvalProcessCompleteYN ame_util.charType;
551     approvers ame_util.approversTable2;
552     tempCount integer;
553     begin
554       check11510(applicationIdIn   => applicationIdIn,
555                  transactionTypeIn => transactionTypeIn);
556       ame_api2.getAllApprovers7(applicationIdIn => applicationIdIn,
557                                 transactionTypeIn => transactionTypeIn,
558                                 transactionIdIn => transactionIdIn,
559                                 approvalProcessCompleteYNOut => approvalProcessCompleteYN,
560                                 approversOut => approvers);
561       ame_util.apprTable2ToApprTable(approversTable2In => approvers,
562                             approversTableOut => approversOut);
563     exception
564         when others then
565           ame_util.runtimeException(packageNameIn => 'ame_api',
566                                     routineNameIn => 'getAllApprovers',
567                                     exceptionNumberIn => sqlcode,
568                                     exceptionStringIn => sqlerrm);
569           approversOut.delete;
570           approversOut(1) := ame_util.emptyApproverRecord;
571           getAdminApprover(applicationIdIn => applicationIdIn,
572                            transactionTypeIn => transactionTypeIn,
573                            adminApproverOut => approversOut(1));
574           raise;
575     end getAllApprovers;
576   procedure getAndRecordAllApprovers(applicationIdIn in integer,
577                                      transactionIdIn in varchar2,
578                                      transactionTypeIn in varchar2 default null,
579                                      approversOut out nocopy ame_util.approversTable) as
580     approvalProcessCompleteYN ame_util.charType;
581     approvers ame_util.approversTable2;
582     itemClasses ame_util.stringList;
583     itemIndexes ame_util.idList;
584     itemIds ame_util.stringList;
585     itemSources ame_util.longStringList;
586     begin
587       check11510(applicationIdIn   => applicationIdIn,
588                  transactionTypeIn => transactionTypeIn);
589       ame_api2.getAndRecordAllApprovers(applicationIdIn => applicationIdIn,
590                                         transactionTypeIn => transactionTypeIn,
591                                         transactionIdIn => transactionIdIn,
592                                         approvalProcessCompleteYNOut => approvalProcessCompleteYN,
593                                         approversOut => approvers,
594                                         itemIndexesOut => itemIndexes,
595                                         itemClassesOut => itemClasses,
596                                         itemIdsOut => itemIds,
597                                         itemSourcesOut => itemSources);
598       ame_util.apprTable2ToApprTable(approversTable2In => approvers,
599                             approversTableOut => approversOut);
600     exception
601         when others then
602           ame_util.runtimeException(packageNameIn => 'ame_api',
603                                     routineNameIn => 'getAndRecordAllApprovers',
604                                     exceptionNumberIn => sqlcode,
605                                     exceptionStringIn => sqlerrm);
606           approversOut.delete;
607           getAdminApprover(applicationIdIn => applicationIdIn,
608                            transactionTypeIn => transactionTypeIn,
609                            adminApproverOut => approversOut(1));
610           raise;
611     end getAndRecordAllApprovers;
612   procedure getApplicableRules1(applicationIdIn in integer,
613                                 transactionIdIn in varchar2,
614                                 transactionTypeIn in varchar2 default null,
615                                 ruleIdsOut out nocopy ame_util.idList) as
616     begin
617       check11510(applicationIdIn   => applicationIdIn,
618                  transactionTypeIn => transactionTypeIn);
619       ame_api3.getApplicableRules1(applicationIdIn => applicationIdIn,
620                                    transactionIdIn => transactionIdIn,
621                                    transactionTypeIn => transactionTypeIn,
622                                    ruleIdsOut => ruleIdsOut);
623     exception
624       when others then
625         ame_util.runtimeException(packageNameIn => 'ame_api',
626                                   routineNameIn => 'getApplicableRules1',
627                                   exceptionNumberIn => sqlcode,
628                                   exceptionStringIn => sqlerrm);
629         raise;
630     end getApplicableRules1;
631   procedure getApplicableRules2(applicationIdIn in integer,
632                                 transactionIdIn in varchar2,
633                                 transactionTypeIn in varchar2 default null,
634                                 ruleDescriptionsOut out nocopy ame_util.stringList) as
635     begin
636       check11510(applicationIdIn   => applicationIdIn,
637                  transactionTypeIn => transactionTypeIn);
638       ame_api3.getApplicableRules2(applicationIdIn => applicationIdIn,
639                                    transactionIdIn => transactionIdIn,
640                                    transactionTypeIn => transactionTypeIn,
641                                    ruleDescriptionsOut => ruleDescriptionsOut);
642     exception
643       when others then
644         ame_util.runtimeException(packageNameIn => 'ame_api',
645                                   routineNameIn => 'getApplicableRules2',
646                                   exceptionNumberIn => sqlcode,
647                                   exceptionStringIn => sqlerrm);
648         raise;
649     end getApplicableRules2;
650   procedure getApplicableRules3(applicationIdIn in integer,
651                                 transactionIdIn in varchar2,
652                                 transactionTypeIn in varchar2 default null,
653                                 ruleIdsOut out nocopy ame_util.idList,
654                                 ruleDescriptionsOut out nocopy ame_util.stringList) as
655     begin
656       check11510(applicationIdIn   => applicationIdIn,
657                  transactionTypeIn => transactionTypeIn);
658       ame_api3.getApplicableRules3(applicationIdIn => applicationIdIn,
659                                    transactionIdIn => transactionIdIn,
660                                    transactionTypeIn => transactionTypeIn,
661                                    ruleIdsOut => ruleIdsOut,
662                                    ruleDescriptionsOut => ruleDescriptionsOut);
663     exception
664       when others then
665         ame_util.runtimeException(packageNameIn => 'ame_api',
666                                   routineNameIn => 'getApplicableRules3',
667                                   exceptionNumberIn => sqlcode,
668                                   exceptionStringIn => sqlerrm);
669         raise;
670     end getApplicableRules3;
671   procedure getApproversAndRules1(applicationIdIn in integer,
672                                   transactionIdIn in varchar2,
673                                   transactionTypeIn in varchar2 default null,
674                                   approversOut out nocopy ame_util.approversTable,
675                                   ruleIdsOut out nocopy ame_util.idList) as
676     approvalProcessCompleteYN ame_util.charType;
677     approvers ame_util.approversTable2;
678     begin
679       check11510(applicationIdIn   => applicationIdIn,
680                  transactionTypeIn => transactionTypeIn);
681       ame_api2.getAllApprovers7(applicationIdIn => applicationIdIn,
682                                 transactionTypeIn => transactionTypeIn,
683                                 transactionIdIn => transactionIdIn,
684                                 approvalProcessCompleteYNOut => approvalProcessCompleteYN,
685                                 approversOut => approvers);
686       ame_api3.getApplicableRules1(applicationIdIn => applicationIdIn,
687                                    transactionIdIn => transactionIdIn,
688                                    transactionTypeIn => transactionTypeIn,
689                                    ruleIdsOut => ruleIdsOut);
690       ame_util.apprTable2ToApprTable(approversTable2In => approvers,
691                             approversTableOut => approversOut);
692     exception
693         when others then
694           ame_util.runtimeException(packageNameIn => 'ame_api',
695                                     routineNameIn => 'getApproversAndRules1',
696                                     exceptionNumberIn => sqlcode,
697                                     exceptionStringIn => sqlerrm);
698           approversOut.delete;
699           ruleIdsOut.delete;
700           getAdminApprover(applicationIdIn => applicationIdIn,
701                            transactionTypeIn => transactionTypeIn,
702                            adminApproverOut => approversOut(1));
703           raise;
704     end getApproversAndRules1;
705   procedure getApproversAndRules2(applicationIdIn in integer,
706                                   transactionIdIn in varchar2,
707                                   transactionTypeIn in varchar2 default null,
708                                   approversOut out nocopy ame_util.approversTable,
709                                   ruleDescriptionsOut out nocopy ame_util.stringList) as
710     approvalProcessCompleteYN ame_util.charType;
711     approvers ame_util.approversTable2;
712     begin
713       check11510(applicationIdIn   => applicationIdIn,
714                  transactionTypeIn => transactionTypeIn);
715       ame_api2.getAllApprovers7(applicationIdIn => applicationIdIn,
716                                 transactionTypeIn => transactionTypeIn,
717                                 transactionIdIn => transactionIdIn,
718                                 approvalProcessCompleteYNOut => approvalProcessCompleteYN,
719                                 approversOut => approvers);
720       ame_api3.getApplicableRules2(applicationIdIn => applicationIdIn,
721                                    transactionIdIn => transactionIdIn,
722                                    transactionTypeIn => transactionTypeIn,
723                                    ruleDescriptionsOut => ruleDescriptionsOut);
724       ame_util.apprTable2ToApprTable(approversTable2In => approvers,
725                             approversTableOut => approversOut);
726     exception
727         when others then
728           ame_util.runtimeException(packageNameIn => 'ame_api',
729                                     routineNameIn => 'getApproversAndRules2',
730                                     exceptionNumberIn => sqlcode,
731                                     exceptionStringIn => sqlerrm);
732           approversOut.delete;
733           ruleDescriptionsOut.delete;
734           getAdminApprover(applicationIdIn => applicationIdIn,
735                            transactionTypeIn => transactionTypeIn,
736                            adminApproverOut => approversOut(1));
737           raise;
738     end getApproversAndRules2;
739   procedure getApproversAndRules3(applicationIdIn in integer,
740                                   transactionIdIn in varchar2,
741                                   transactionTypeIn in varchar2 default null,
742                                   approversOut out nocopy ame_util.approversTable,
743                                   ruleIdsOut out nocopy ame_util.idList,
744                                   ruleDescriptionsOut out nocopy ame_util.stringList) as
745     approvalProcessCompleteYN ame_util.charType;
746     approvers ame_util.approversTable2;
747     begin
748       check11510(applicationIdIn   => applicationIdIn,
749                  transactionTypeIn => transactionTypeIn);
750       ame_api2.getAllApprovers7(applicationIdIn => applicationIdIn,
751                                 transactionTypeIn => transactionTypeIn,
752                                 transactionIdIn => transactionIdIn,
753                                 approvalProcessCompleteYNOut => approvalProcessCompleteYN,
754                                 approversOut => approvers);
755       ame_api3.getApplicableRules3(applicationIdIn => applicationIdIn,
756                                    transactionIdIn => transactionIdIn,
757                                    transactionTypeIn => transactionTypeIn,
758                                    ruleIdsOut => ruleIdsOut,
759                                    ruleDescriptionsOut => ruleDescriptionsOut);
760       ame_util.apprTable2ToApprTable(approversTable2In => approvers,
761                             approversTableOut => approversOut);
762       exception
763         when others then
764           ame_util.runtimeException(packageNameIn => 'ame_api',
765                                     routineNameIn => 'getApproversAndRules3',
766                                     exceptionNumberIn => sqlcode,
767                                     exceptionStringIn => sqlerrm);
768           approversOut.delete;
769           ruleIdsOut.delete;
770           ruleDescriptionsOut.delete;
771           getAdminApprover(applicationIdIn => applicationIdIn,
772                            transactionTypeIn => transactionTypeIn,
773                            adminApproverOut => approversOut(1));
774           raise;
775     end getApproversAndRules3;
776   procedure getAvailableInsertions(applicationIdIn in integer,
777                                    transactionIdIn in varchar2,
778                                    positionIn in integer,
779                                    transactionTypeIn in varchar2 default null,
780                                    availableInsertionsOut out nocopy ame_util.insertionsTable) as
781       i integer;
782       tempParameter ame_util.longestStringType;
783       availableInsertions ame_util.insertionsTable2;
784     begin
785       check11510(applicationIdIn   => applicationIdIn,
786                  transactionTypeIn => transactionTypeIn);
787       ame_api3.getAvailableInsertions(applicationIdIn => applicationIdIn,
788                                       transactionIdIn => transactionIdIn,
789                                       positionIn => positionIn,
790                                       transactionTypeIn => transactionTypeIn,
791                                       availableInsertionsOut => availableInsertions);
792       ame_util.insTable2ToInsTable(insertionsTable2In => availableInsertions,
793                           insertionsTableOut => availableInsertionsOut);
794     exception
795       when others then
796         ame_util.runtimeException(packageNameIn => 'ame_api',
797                                   routineNameIn => 'getAvailableInsertions',
798                                   exceptionNumberIn => sqlcode,
799                                   exceptionStringIn => sqlerrm);
800         raise;
801     end getAvailableInsertions;
802   procedure getAvailableOrders(applicationIdIn in integer,
803                                transactionIdIn in varchar2,
804                                positionIn in integer,
805                                transactionTypeIn in varchar2 default null,
806                                availableOrdersOut out nocopy ame_util.ordersTable) as
807     approvers ame_util.approversTable2;
808     approversCount integer;
809     availableOrdersIndex integer; /* pre-increment */
810     errorCode integer;
811     errorMessage ame_util.longestStringType;
812     invalidPositionException exception;
813     nextApproverDescription varchar2(100);
814     prevApproverDescription varchar2(100);
815     ruleIdList ame_util.idList;
816     sourceDescription ame_util.stringType;
817     tempBoolean boolean;
818     tempInsertionDoesNotExist boolean;
819     tempOrigSystem ame_util.stringType;
820     tempOrigSystemId integer;
821     tempParameter ame_temp_insertions.parameter%type;
822     begin
823       check11510(applicationIdIn   => applicationIdIn,
824                  transactionTypeIn => transactionTypeIn);
825       ame_engine.updateTransactionState(isTestTransactionIn => false,
826                                         isLocalTransactionIn => false,
827                                         fetchConfigVarsIn => true,
828                                         fetchOldApproversIn => true,
829                                         fetchInsertionsIn => true,
830                                         fetchDeletionsIn => true,
831                                         fetchAttributeValuesIn => true,
832                                         fetchInactiveAttValuesIn => false,
833                                         processProductionActionsIn => false,
834                                         processProductionRulesIn => false,
835                                         updateCurrentApproverListIn => true,
836                                         updateOldApproverListIn => false,
837                                         processPrioritiesIn => true,
838                                         prepareItemDataIn => false,
839                                         prepareRuleIdsIn => false,
840                                         prepareRuleDescsIn => false,
841                                         transactionIdIn => transactionIdIn,
842                                         ameApplicationIdIn => null,
843                                         fndApplicationIdIn => applicationIdIn,
844                                         transactionTypeIdIn => transactionTypeIn );
845       ame_engine.getApprovers(approversOut => approvers);
846       approversCount := approvers.count;
847       /* Check that positionIn is in bounds. */
848       if(positionIn < 1 or
849          positionIn > approversCount + 1 or
850          not ame_util.isANonNegativeInteger(stringIn => positionIn)) then
851         raise invalidPositionException;
852       end if;
853       availableOrdersIndex := 0;
854       /*
855         ORDER TYPE:  absoluteOrder
856         absoluteOrder is always available.
857       */
858       tempParameter := positionIn;
859       if(not ame_engine.insertionExists(orderTypeIn => ame_util.absoluteOrder,
860                                         parameterIn => tempParameter)) then
861         availableOrdersIndex := availableOrdersIndex + 1;
862         availableOrdersOut(availableOrdersIndex).order_type := ame_util.absoluteOrder;
863         availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
864         availableOrdersOut(availableOrdersIndex).description :=
865               ame_util.absoluteOrderDescription || positionIn || '.  ';
866       end if;
867       /*
868         ORDER TYPE:  afterApprover
869         Ad-hoc afterApprover is available if positionIn > 1.
870       */
871       if(positionIn = 1 or
872            approversCount = 0) then
873         prevApproverDescription := null;
874       else
875         ame_approver_type_pkg.getOrigSystemIdAndDisplayName(nameIn =>approvers(positionIn - 1).name,
876                                           origSystemOut => tempOrigSystem,
877                                           origSystemIdOut => tempOrigSystemId,
878                                           displayNameOut => prevApproverDescription);
879         if tempOrigSystem = ame_util.perOrigSystem then
880           tempOrigSystem := 'person_id';
881         elsif tempOrigSystem = ame_util.fndUserOrigSystem then
882           tempOrigSystem := 'user_id';
883         end if;
884         tempParameter := tempOrigSystem || ':' || tempOrigSystemId || ':' ||
885                          approvers(positionIn - 1).action_type_id || ':' ||
886                          approvers(positionIn - 1).group_or_chain_id ||':' ||
887                          approvers(positionIn - 1).occurrence;
888         tempInsertionDoesNotExist := not ame_engine.insertionExists(orderTypeIn => ame_util.afterApprover,
889                                                                       parameterIn => tempParameter);
890         if(tempInsertionDoesNotExist) then
891           availableOrdersIndex := availableOrdersIndex + 1;
892           availableOrdersOut(availableOrdersIndex).order_type := ame_util.afterApprover;
893           availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
894           availableOrdersOut(availableOrdersIndex).description := ame_util.afterApproverDescription ||
895                                                                           prevApproverDescription;
896         end if;
897       end if;
898       /*
899         ORDER TYPE:  beforeApprover
900         beforeApprover is available if approversCount > 0 and positionIn < approversCount + 1.
901       */
902       if(positionIn = approversCount + 1 or
903          approversCount = 0) then
904         nextApproverDescription := null;
905       else
906         ame_approver_type_pkg.getOrigSystemIdAndDisplayName(nameIn =>approvers(positionIn).name,
907                                           origSystemOut => tempOrigSystem,
908                                           origSystemIdOut => tempOrigSystemId,
909                                           displayNameOut => nextApproverDescription);
910         if tempOrigSystem = ame_util.perOrigSystem then
911           tempOrigSystem := 'person_id';
912         elsif tempOrigSystem = ame_util.fndUserOrigSystem then
913           tempOrigSystem := 'user_id';
914         end if;
915         tempParameter := tempOrigSystem || ':' || tempOrigSystemId || ':' ||
916                          approvers(positionIn).action_type_id || ':' ||
917                          approvers(positionIn).group_or_chain_id ||':' ||
918                          approvers(positionIn).occurrence;
919         if(not ame_engine.insertionExists(orderTypeIn => ame_util.beforeApprover,
920                                           parameterIn => tempParameter)) then
921           availableOrdersIndex := availableOrdersIndex + 1;
922           availableOrdersOut(availableOrdersIndex).order_type := ame_util.beforeApprover;
923           availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
924           availableOrdersOut(availableOrdersIndex).description :=
925                       ame_util.beforeApproverDescription || nextApproverDescription;
926         end if;
927       end if;
928         /*
929         ORDER TYPE:  firstAuthority
930         firstAuthority is available if the approver you're at is the first COA approver in a chain.
931       */
932       if(positionIn < approversCount + 1 and
933          approvers(positionIn).authority = ame_util.authorityApprover and
934          approvers(positionIn).api_insertion <> ame_util.apiInsertion ) then
935         tempBoolean := true; /* tempBoolean remains true if no previous authority is found.  */
936         for i in reverse 1..positionIn - 1 loop
937           if(approvers(i).group_or_chain_id <> approvers(positionIn).group_or_chain_id or
938              approvers(i).action_type_id <> approvers(positionIn).action_type_id or
939              approvers(i).item_id <> approvers(positionIn).item_id or
940              approvers(i).item_class <> approvers(positionIn).item_class) then
941             exit;
942           end if;
943           if(approvers(i).authority = ame_util.authorityApprover and
944              approvers(i).api_insertion <> ame_util.apiInsertion) then
945             tempBoolean := false;
946             exit;
947           end if;
948         end loop;
949         if(tempBoolean) then
950           tempParameter := ame_util.firstAuthorityParameter ;
951           if(not ame_engine.insertionExists(orderTypeIn => ame_util.firstAuthority,
952                                             parameterIn => tempParameter)) then
953             availableOrdersIndex := availableOrdersIndex + 1;
954             availableOrdersOut(availableOrdersIndex).order_type := ame_util.firstAuthority;
955             availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
956             availableOrdersOut(availableOrdersIndex).description := ame_util.firstAuthorityDescription;
957           end if;
958         end if;
959       end if;
960       /*
961         ORDER TYPE:  firstPostApprover
962           if(the approver list is empty) then
963             allow a first-post-approver insertion for the header
964           elsif(positionIn is after the end of the approver list) then
965             if(the last approver in the list is not a post-approver) then
966               allow a first-post-approver insertion for the last approver's item
967             end if
968           elsif(positionIn = 1) then
969             if(the first approver in the list is a post-approver_ then
970               allow a first-post-approver insertion for the first approver's item
971             end if
972           else
973             if(the approvers at positionIn - 1 and positionIn are for the same item) then
974               if(the first approver is not a post-approver and
975                  the second approver is a post-approver) then
976                 allow a first-post-approver insertion for the approvers' item
977               end if
978             else
979               if(the second approver is a post-approver) then
980                 allow a first-post-approver insertion for the second approver's item
981               end if
982               if(the first approver is not a post-approver) then
983                 allow a first-post-approver insertion for the first approver's item
984               end if
985             end if
986           end if
987       */
988       tempParameter := ame_util.firstPostParameter ;
989       if(approversCount = 0) then
990         if(not ame_engine.insertionExists(orderTypeIn => ame_util.firstPostApprover,
991                                           parameterIn => tempParameter)) then
992           availableOrdersIndex := availableOrdersIndex + 1;
993           availableOrdersOut(availableOrdersIndex).order_type := ame_util.firstPostApprover;
994           availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
995           availableOrdersOut(availableOrdersIndex).description := ame_util.firstPostApproverDescription;
996         end if;
997       elsif(positionIn = approversCount + 1) then
998         if(approvers(approversCount).authority <> ame_util.postApprover) then
999           if(not ame_engine.insertionExists(orderTypeIn => ame_util.firstPostApprover,
1000                                             parameterIn => tempParameter)) then
1001             availableOrdersIndex := availableOrdersIndex + 1;
1002             availableOrdersOut(availableOrdersIndex).order_type := ame_util.firstPostApprover;
1003             availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1004             availableOrdersOut(availableOrdersIndex).description := ame_util.firstPostApproverDescription;
1005           end if;
1006         end if;
1007       elsif(positionIn = 1) then
1008         if(approvers(1).authority = ame_util.postApprover) then
1009           if(not ame_engine.insertionExists(orderTypeIn => ame_util.firstPostApprover,
1010                                             parameterIn => tempParameter)) then
1011             availableOrdersIndex := availableOrdersIndex + 1;
1012             availableOrdersOut(availableOrdersIndex).order_type := ame_util.firstPostApprover;
1013             availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1014             availableOrdersOut(availableOrdersIndex).description := ame_util.firstPostApproverDescription;
1015           end if;
1016         end if;
1017       else
1018         if(approvers(positionIn - 1).item_id = approvers(positionIn).item_id and
1019            approvers(positionIn - 1).item_class = approvers(positionIn).item_class) then
1020           if(approvers(positionIn - 1).authority <> ame_util.postApprover and
1021              approvers(positionIn).authority = ame_util.postApprover) then
1022             if(not ame_engine.insertionExists(orderTypeIn => ame_util.firstPostApprover,
1023                                               parameterIn => tempParameter)) then
1024               availableOrdersIndex := availableOrdersIndex + 1;
1025               availableOrdersOut(availableOrdersIndex).order_type := ame_util.firstPostApprover;
1026               availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1027               availableOrdersOut(availableOrdersIndex).description := ame_util.firstPostApproverDescription;
1028             end if;
1029           end if;
1030         else
1031           if(approvers(positionIn).authority = ame_util.postApprover) then
1032             if(not ame_engine.insertionExists(orderTypeIn => ame_util.firstPostApprover,
1033                                               parameterIn => tempParameter)) then
1034               availableOrdersIndex := availableOrdersIndex + 1;
1035               availableOrdersOut(availableOrdersIndex).order_type := ame_util.firstPostApprover;
1036               availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1037               availableOrdersOut(availableOrdersIndex).description := ame_util.firstPostApproverDescription;
1038             end if;
1039           end if;
1040           if(approvers(positionIn - 1).authority <> ame_util.postApprover) then
1041             if(not ame_engine.insertionExists(orderTypeIn => ame_util.firstPostApprover,
1042                                               parameterIn => tempParameter)) then
1043               availableOrdersIndex := availableOrdersIndex + 1;
1044               availableOrdersOut(availableOrdersIndex).order_type := ame_util.firstPostApprover;
1045               availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1046               availableOrdersOut(availableOrdersIndex).description := ame_util.firstPostApproverDescription;
1047             end if;
1048           end if;
1049         end if;
1050       end if;
1051       /*
1052         ORDER TYPE:  firstPreApprover
1053         Assume that in the case of an entirely empty approver list, we allow insertion of a first
1054         pre-approver into the header item's list only.  Otherwise, we only allow insertion of
1055 a
1056         first pre-approver into a non-empty item list.  Here is the case analysis:
1057           if(the approver list is empty) then
1058             allow a first-pre-approver insertion for the header item
1059           elsif(positionIn = 1) then
1060             allow a first-pre-approver insertion for the first approver's item
1061           elsif(positionIn < approversCount + 1) then
1062             if(the approvers at positionIn - 1 and positionIn are for different items) then
1063               allow a first-pre-approver insertion for the second approver's item
1064             end if
1065           end if
1066       */
1067       tempParameter := ame_util.firstPreApprover ;
1068       if(approversCount = 0) then
1069         if(not ame_engine.insertionExists(orderTypeIn => ame_util.firstPreApprover,
1070                                           parameterIn => tempParameter)) then
1071           availableOrdersIndex := availableOrdersIndex + 1;
1072           availableOrdersOut(availableOrdersIndex).order_type := ame_util.firstPreApprover;
1073           availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1074           availableOrdersOut(availableOrdersIndex).description := ame_util.firstPreApproverDescription;
1075         end if;
1076       elsif(positionIn = 1) then
1077         if(not ame_engine.insertionExists(orderTypeIn => ame_util.firstPreApprover,
1078                                           parameterIn => tempParameter)) then
1079           availableOrdersIndex := availableOrdersIndex + 1;
1080           availableOrdersOut(availableOrdersIndex).order_type := ame_util.firstPreApprover;
1081           availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1082           availableOrdersOut(availableOrdersIndex).description := ame_util.firstPreApproverDescription;
1083         end if;
1084       elsif(positionIn < approversCount + 1) then
1085         if(approvers(positionIn - 1).item_id <> approvers(positionIn).item_id or
1086            approvers(positionIn - 1).item_class <> approvers(positionIn).item_class) then
1087           if(not ame_engine.insertionExists(orderTypeIn => ame_util.firstPreApprover,
1088                                             parameterIn => tempParameter)) then
1089             availableOrdersIndex := availableOrdersIndex + 1;
1090             availableOrdersOut(availableOrdersIndex).order_type := ame_util.firstPreApprover;
1091             availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1092             availableOrdersOut(availableOrdersIndex).description := ame_util.firstPreApproverDescription;
1093           end if;
1094         end if;
1095       end if;
1096       /*
1097         ORDER TYPE:  lastPostApprover
1098         Assume that in the case of an entirely empty approver list, we allow insertion of a last
1099         post-approver into the header item's list only.  Otherwise, we only allow insertion of a
1100         last post-approver into a non-empty item list.  Here is the case analysis:
1101           if(the approver list is empty) then
1102             allow last-post-approver insertion for the header item
1103           elsif(positionIn = approversCount + 1) then
1104             allow last-post-approver insertion for the last approver's item
1105           elsif(positionIn > 1) then
1106             if(the approvers at positionIn - 1 and positionIn are for different items) then
1107               allow last-post-approver insertion for the former approver's item
1108             end if
1109           end if
1110       */
1111       tempParameter := ame_util.lastPostApprover ;
1112       if(approversCount = 0) then
1113         if(not ame_engine.insertionExists(orderTypeIn => ame_util.lastPostApprover,
1114                                           parameterIn => tempParameter)) then
1115           availableOrdersIndex := availableOrdersIndex + 1;
1116           availableOrdersOut(availableOrdersIndex).order_type := ame_util.lastPostApprover;
1117           availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1118           availableOrdersOut(availableOrdersIndex).description := ame_util.lastPostApproverDescription;
1119         end if;
1120       elsif(positionIn = approversCount + 1) then
1121         if(not ame_engine.insertionExists(orderTypeIn => ame_util.lastPostApprover,
1122                                           parameterIn => tempParameter)) then
1123           availableOrdersIndex := availableOrdersIndex + 1;
1124           availableOrdersOut(availableOrdersIndex).order_type := ame_util.lastPostApprover;
1125           availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1126           availableOrdersOut(availableOrdersIndex).description := ame_util.lastPostApproverDescription;
1127         end if;
1128       elsif(positionIn > 1) then
1129         if(approvers(positionIn - 1).item_id <> approvers(positionIn).item_id or
1130            approvers(positionIn - 1).item_class <> approvers(positionIn).item_class) then
1131           if(not ame_engine.insertionExists(orderTypeIn => ame_util.lastPostApprover,
1132                                             parameterIn => tempParameter)) then
1133             availableOrdersIndex := availableOrdersIndex + 1;
1134             availableOrdersOut(availableOrdersIndex).order_type := ame_util.lastPostApprover;
1135             availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1136             availableOrdersOut(availableOrdersIndex).description := ame_util.lastPostApproverDescription;
1137           end if;
1138         end if;
1139       end if;
1140       /*
1141         ORDER TYPE:  lastPreApprover
1142         Assume that in the case of an entirely empty approver list, we allow insertion of a last
1143         pre-approver into the header item's list only.  Otherwise, we only allow insertion of a
1144         last pre-approver into a non-empty item list.  Here is the case analysis:
1145           if(the approver list is empty) then
1146             allow last-pre-approver insertion for the header item
1147           elsif(positionIn = 1) then
1148             if(the approver at position 1 is not a pre-approver) then
1149               allow last-pre-approver insertion for the item of the first approver
1150             end if
1151           elsif(positionIn <= approversCount) then
1152             if(the approvers at positionIn - 1 and positionIn are for the same item) then
1153               if(the approver at positionIn - 1 is a pre-approver and
1154                  the approver at positionIn is not a pre-approver) then
1155                 allow last-pre-approver insertion for the approvers' item
1156               end if
1157             else
1158               if(the approver at positionIn is not a pre-approver) then
1159                 allow last-pre-approver insertion for the item of the approver at positionIn
1160               end if
1161             end if
1162           end if
1163       */
1164       tempParameter := ame_util.lastPreApprover ;
1165       if(approversCount = 0) then
1166         if(not ame_engine.insertionExists(orderTypeIn => ame_util.lastPreApprover,
1167                                           parameterIn => tempParameter)) then
1168           availableOrdersIndex := availableOrdersIndex + 1;
1169           availableOrdersOut(availableOrdersIndex).order_type := ame_util.lastPreApprover;
1170           availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1171           availableOrdersOut(availableOrdersIndex).description := ame_util.lastPreApproverDescription;
1172         end if;
1173       elsif(positionIn = 1) then
1174         if(approvers(1).authority <> ame_util.preApprover) then
1175           if(not ame_engine.insertionExists(orderTypeIn => ame_util.lastPreApprover,
1176                                             parameterIn => tempParameter)) then
1177             availableOrdersIndex := availableOrdersIndex + 1;
1178             availableOrdersOut(availableOrdersIndex).order_type := ame_util.lastPreApprover;
1179             availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1180             availableOrdersOut(availableOrdersIndex).description := ame_util.lastPreApproverDescription;
1181           end if;
1182         end if;
1183       elsif(positionIn <= approversCount) then
1184         if(approvers(positionIn - 1).item_id = approvers(positionIn).item_id and
1185            approvers(positionIn - 1).item_class = approvers(positionIn).item_class) then
1186           if(approvers(positionIn - 1).authority = ame_util.preApprover and
1187              approvers(positionIn).authority <> ame_util.preApprover) then
1188             if(not ame_engine.insertionExists(orderTypeIn => ame_util.lastPreApprover,
1189                                               parameterIn => tempParameter)) then
1190               availableOrdersIndex := availableOrdersIndex + 1;
1191               availableOrdersOut(availableOrdersIndex).order_type := ame_util.lastPreApprover;
1192               availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1193               availableOrdersOut(availableOrdersIndex).description := ame_util.lastPreApproverDescription;
1194             end if;
1195           end if;
1196         else
1197           if(approvers(positionIn).authority <> ame_util.preApprover) then
1198             if(not ame_engine.insertionExists(orderTypeIn => ame_util.lastPreApprover,
1199                                               parameterIn => tempParameter)) then
1200               availableOrdersIndex := availableOrdersIndex + 1;
1201               availableOrdersOut(availableOrdersIndex).order_type := ame_util.lastPreApprover;
1202               availableOrdersOut(availableOrdersIndex).parameter := tempParameter;
1203               availableOrdersOut(availableOrdersIndex).description := ame_util.lastPreApproverDescription;
1204             end if;
1205           end if;
1206         end if;
1207       end if;
1208       exception
1209       when invalidPositionException then
1210         errorCode := -20001;
1211         errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
1212                                  messageNameIn => 'AME_400418_INVALID_INSERTION');
1213         ame_util.runtimeException(packageNameIn => 'ame_api',
1214                                   routineNameIn => 'getAvailableOrders',
1215                                   exceptionNumberIn => errorCode,
1216                                   exceptionStringIn => errorMessage);
1217         raise_application_error(errorCode,
1218                                 errorMessage);
1219       when others then
1220         ame_util.runtimeException(packageNameIn => 'ame_api',
1221                                   routineNameIn => 'getAvailableOrders',
1222                                   exceptionNumberIn => sqlcode,
1223                                   exceptionStringIn => sqlerrm);
1224         raise;
1225     end getAvailableOrders;
1226   procedure getConditionDetails(conditionIdIn in integer,
1227                                 attributeNameOut out nocopy varchar2,
1228                                 attributeTypeOut out nocopy varchar2,
1229                                 attributeDescriptionOut out nocopy varchar2,
1230                                 lowerLimitOut out nocopy varchar2,
1231                                 upperLimitOut out nocopy varchar2,
1232                                 includeLowerLimitOut out nocopy varchar2,
1233                                 includeUpperLimitOut out nocopy varchar2,
1234                                 currencyCodeOut out nocopy varchar2,
1235                                 allowedValuesOut out nocopy ame_util.longestStringList) as
1236     begin
1237       ame_api3.getConditionDetails(conditionIdIn => conditionIdIn,
1238                                    attributeNameOut => attributeNameOut,
1239                                    attributeTypeOut => attributeTypeOut,
1240                                    attributeDescriptionOut => attributeDescriptionOut,
1241                                    lowerLimitOut => lowerLimitOut,
1242                                    upperLimitOut => upperLimitOut,
1243                                    includeLowerLimitOut => includeLowerLimitOut,
1244                                    includeUpperLimitOut => includeUpperLimitOut,
1245                                    currencyCodeOut => currencyCodeOut,
1246                                    allowedValuesOut => allowedValuesOut);
1247     exception
1248       when others then
1249         ame_util.runtimeException(packageNameIn => 'ame_api',
1250                                   routineNameIn => 'getConditionDetails',
1251                                   exceptionNumberIn => sqlcode,
1252                                   exceptionStringIn => sqlerrm);
1253         raise;
1254     end getConditionDetails;
1255   procedure getGroupMembers(applicationIdIn in number,
1256                             transactionTypeIn in varchar2,
1257                             transactionIdIn in varchar2,
1258                             groupIdIn in number,
1259                             memberOrderNumbersOut out  nocopy ame_util.idList,
1260                             memberPersonIdsOut out  nocopy ame_util.idList,
1261                             memberUserIdsOut out  nocopy ame_util.idList) as
1262     begin
1263       null;
1264     end getGroupMembers;
1265   procedure getNextApprover(applicationIdIn in integer,
1266                             transactionIdIn in varchar2,
1267                             transactionTypeIn in varchar2 default null,
1268                             nextApproverOut out nocopy ame_util.approverRecord) as
1269     ameApplicationId integer;
1270     approvalProcessCompleteYN ame_util.charType;
1271     counter integer;
1272     nextApprovers ame_util.approversTable2;
1273     parallelizationFoundException exception;
1274     errorCode integer;
1275     errorMessage ame_util.longestStringType;
1276     begin
1277       check11510(applicationIdIn   => applicationIdIn,
1278                  transactionTypeIn => transactionTypeIn);
1279       loop
1280         ame_util2.detailedApprovalStatusFlagYN := ame_util.booleanTrue;
1281         ame_api2.getNextApprovers4(applicationIdIn => applicationIdIn,
1282                                    transactionTypeIn => transactionTypeIn,
1283                                    transactionIdIn => transactionIdIn,
1284                                    flagApproversAsNotifiedIn => ame_util.booleanFalse,
1285                                    approvalProcessCompleteYNOut => approvalProcessCompleteYN,
1286                                    nextApproversOut => nextApprovers);
1287         if ameApplicationId is null then
1288           ameApplicationId := ame_engine.getAmeApplicationId;
1289         end if;
1290         if approvalProcessCompleteYN = ame_util2.completeFullyApproved or
1291            approvalProcessCompleteYN = ame_util2.completeFullyRejected or
1292            approvalProcessCompleteYN = ame_util2.completePartiallyApproved or
1293            approvalProcessCompleteYN = ame_util2.completeNoApprovers then
1294           nextApproverOut := ame_util.emptyApproverRecord;
1295           exit;
1296         else
1297           if(nextApprovers.count > 1) then
1298             raise parallelizationFoundException;
1299           end if;
1300           counter := 0;
1301           for i in 1 .. nextApprovers.count loop
1302             if nextApprovers(i).approver_category = ame_util.approvalApproverCategory then
1303               counter := i;
1304               exit;
1305             else
1306               update ame_temp_old_approver_lists
1307                 set approval_status = ame_util.notifiedStatus
1308                 where item_class = nextApprovers(i).item_class and
1309                       item_id = nextApprovers(i).item_id and
1310                       name = nextApprovers(i).name and
1311                       action_type_id = nextApprovers(i).action_type_id and
1312                       group_or_chain_id = nextApprovers(i).group_or_chain_id and
1313                       occurrence = nextApprovers(i).occurrence and
1314                       transaction_id = transactionIdIn  and
1315                       application_id = ameApplicationId;
1316             end if;
1317           end loop;
1318           if counter <> 0 then
1319             ame_util.apprRecord2ToApprRecord(approverRecord2In => nextApprovers(counter),
1320                                     approverRecordOut => nextApproverOut);
1321             exit;
1322           end if;
1323         end if;
1324      end loop;
1325 /*  delete after talking to TM and SS - nsoni
1326       ame_api2.getNextApprovers4(applicationIdIn => applicationIdIn,
1327                                  transactionTypeIn => transactionTypeIn,
1328                                  transactionIdIn => transactionIdIn,
1329                                  flagApproversAsNotifiedIn => ame_util.booleanFalse,
1330                                  approvalProcessCompleteYNOut => approvalProcessCompleteYN,
1331                                  nextApproversOut => nextApprovers);
1332       if approvalProcessCompleteYN = ame_util.booleanTrue then
1333         nextApproverOut := ame_util.emptyApproverRecord;
1334       else
1335         ame_util.apprRecord2ToApprRecord(approverRecord2In => nextApprovers(1),
1336                                 approverRecordOut => nextApproverOut);
1337       end if;
1338 */
1339     exception
1340       when parallelizationFoundException then
1341           errorCode := -20001;
1342           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
1343                                               messageNameIn => 'AME_400679_API_PARALLEL_CONFIG');
1344           ame_util.runtimeException(packageNameIn => 'ame_api',
1345                                     routineNameIn => 'getNextApprover',
1346                                     exceptionNumberIn => errorCode,
1347                                     exceptionStringIn => errorMessage);
1348           raise_application_error(errorCode,
1349                                   errorMessage);
1350       when others then
1351           ame_util.runtimeException(packageNameIn => 'ame_api',
1352                                     routineNameIn => 'getNextApprover',
1353                                     exceptionNumberIn => sqlcode,
1354                                     exceptionStringIn => sqlerrm);
1355           getAdminApprover(applicationIdIn => applicationIdIn,
1356                            transactionTypeIn => transactionTypeIn,
1357                            adminApproverOut => nextApproverOut);
1358           raise;
1359     end getNextApprover;
1360   procedure getOldApprovers(applicationIdIn in integer,
1361                             transactionIdIn in varchar2,
1362                             transactionTypeIn in varchar2 default null,
1363                             oldApproversOut out nocopy ame_util.approversTable) as
1364     approvers ame_util.approversTable2;
1365     begin
1366       ame_api3.getOldApprovers(applicationIdIn => applicationIdIn,
1367                                transactionIdIn => transactionIdIn,
1368                                transactionTypeIn => transactionTypeIn,
1369                                oldApproversOut => approvers);
1370       ame_util.apprTable2ToApprTable(approversTable2In => approvers,
1371                             approversTableOut => oldApproversOut);
1372     exception
1373       when others then
1374           ame_util.runtimeException(packageNameIn => 'ame_api',
1375                                     routineNameIn => 'getOldApprovers',
1376                                     exceptionNumberIn => sqlcode,
1377                                     exceptionStringIn => sqlerrm);
1378           oldApproversOut.delete;
1379           getAdminApprover(applicationIdIn => applicationIdIn,
1380                            transactionTypeIn => transactionTypeIn,
1381                            adminApproverOut => oldApproversOut(1));
1382           raise;
1383     end getOldApprovers;
1384   procedure getRuleDetails1(ruleIdIn in integer,
1385                             ruleTypeOut out nocopy varchar2,
1386                             ruleDescriptionOut out nocopy varchar2,
1387                             conditionIdsOut out nocopy ame_util.idList,
1388                             approvalTypeNameOut out nocopy varchar2,
1389                             approvalTypeDescriptionOut out nocopy varchar2,
1390                             approvalDescriptionOut out nocopy varchar2) as
1391       approvalTypeNames ame_util.stringList;
1392       approvalTypeDescriptions ame_util.stringList;
1393       approvalDescriptions ame_util.stringList;
1394     begin
1395       ame_api3.getRuleDetails1(ruleIdIn => ruleIdIn,
1396                                ruleTypeOut => ruleTypeOut,
1397                                ruleDescriptionOut => ruleDescriptionOut,
1398                                conditionIdsOut => conditionIdsOut,
1399                                actionTypeNamesOut => approvalTypeNames,
1400                                actionTypeDescriptionsOut => approvalTypeDescriptions,
1401                                actionDescriptionsOut => approvalDescriptions);
1402         if approvalTypeNames.count = 0 then
1403           approvalTypeNameOut := null;
1404           approvalTypeDescriptionOut := null;
1405           approvalDescriptionOut := null;
1406         else
1407           approvalTypeNameOut := approvalTypeNames(1);
1408           approvalTypeDescriptionOut := approvalTypeDescriptions(1);
1409           approvalDescriptionOut := approvalDescriptions(1);
1410         end if;
1411     exception
1412       when others then
1413           ame_util.runtimeException(packageNameIn => 'ame_api',
1414                                     routineNameIn => 'getRuleDetails1',
1415                                     exceptionNumberIn => sqlcode,
1416                                     exceptionStringIn => sqlerrm);
1417           conditionIdsOut.delete;
1418           raise;
1419     end getRuleDetails1;
1420   procedure getRuleDetails2(ruleIdIn in integer,
1421                             ruleTypeOut out nocopy varchar2,
1422                             ruleDescriptionOut out nocopy varchar2,
1423                             conditionDescriptionsOut out nocopy ame_util.longestStringList,
1424                             approvalTypeNameOut out nocopy varchar2,
1425                             approvalTypeDescriptionOut out nocopy varchar2,
1426                             approvalDescriptionOut out nocopy varchar2) as
1427       approvalTypeNames ame_util.stringList;
1428       approvalTypeDescriptions ame_util.stringList;
1429       approvalDescriptions ame_util.stringList;
1430     begin
1431       ame_api3.getRuleDetails2(ruleIdIn => ruleIdIn,
1432                                ruleTypeOut => ruleTypeOut,
1433                                ruleDescriptionOut => ruleDescriptionOut,
1434                                conditionDescriptionsOut => conditionDescriptionsOut,
1435                                actionTypeNamesOut => approvalTypeNames,
1436                                actionTypeDescriptionsOut => approvalTypeDescriptions,
1437                                actionDescriptionsOut => approvalDescriptions);
1438         if approvalTypeNames.count = 0 then
1439           approvalTypeNameOut := null;
1440           approvalTypeDescriptionOut := null;
1441           approvalDescriptionOut := null;
1442         else
1443           approvalTypeNameOut := approvalTypeNames(1);
1444           approvalTypeDescriptionOut := approvalTypeDescriptions(1);
1445           approvalDescriptionOut := approvalDescriptions(1);
1446         end if;
1447     exception
1448       when others then
1449           ame_util.runtimeException(packageNameIn => 'ame_api',
1450                                     routineNameIn => 'getRuleDetails2',
1451                                     exceptionNumberIn => sqlcode,
1452                                     exceptionStringIn => sqlerrm);
1453           conditionDescriptionsOut.delete;
1454           raise;
1455     end getRuleDetails2;
1456   procedure getRuleDetails3(ruleIdIn in integer,
1457                             ruleTypeOut out nocopy varchar2,
1458                             ruleDescriptionOut out nocopy varchar2,
1459                             conditionIdsOut out nocopy ame_util.idList,
1460                             conditionDescriptionsOut out nocopy ame_util.longestStringList,
1461                             conditionHasLOVsOut out nocopy ame_util.charList,
1462                               /* Each value is ame_util.booleanTrue or ame_util.booleanFalse. */
1463                             approvalTypeNameOut out nocopy varchar2,
1464                             approvalTypeDescriptionOut out nocopy varchar2,
1465                             approvalDescriptionOut out nocopy varchar2) as
1466       approvalTypeNames ame_util.stringList;
1467       approvalTypeDescriptions ame_util.stringList;
1468       approvalDescriptions ame_util.stringList;
1469     begin
1470       ame_api3.getRuleDetails3(ruleIdIn => ruleIdIn,
1471                                ruleTypeOut => ruleTypeOut,
1472                                ruleDescriptionOut => ruleDescriptionOut,
1473                                conditionIdsOut => conditionIdsOut,
1474                                conditionDescriptionsOut => conditionDescriptionsOut,
1475                                conditionHasLOVsOut => conditionHasLOVsOut,
1476                                actionTypeNamesOut => approvalTypeNames,
1477                                actionTypeDescriptionsOut => approvalTypeDescriptions,
1478                                actionDescriptionsOut => approvalDescriptions);
1479         if approvalTypeNames.count = 0 then
1480           approvalTypeNameOut := null;
1481           approvalTypeDescriptionOut := null;
1482           approvalDescriptionOut := null;
1483         else
1484           approvalTypeNameOut := approvalTypeNames(1);
1485           approvalTypeDescriptionOut := approvalTypeDescriptions(1);
1486           approvalDescriptionOut := approvalDescriptions(1);
1487         end if;
1488       exception
1489         when others then
1490           ame_util.runtimeException(packageNameIn => 'ame_api',
1491                                     routineNameIn => 'getRuleDetails3',
1492                                     exceptionNumberIn => sqlcode,
1493                                     exceptionStringIn => sqlerrm);
1494           conditionIdsOut.delete;
1495           conditionDescriptionsOut.delete;
1496           raise;
1497     end getRuleDetails3;
1498   procedure initializeApprovalProcess(applicationIdIn in integer,
1499                                       transactionIdIn in varchar2,
1500                                       transactionTypeIn in varchar2 default null,
1501                                       recordApproverListIn in boolean default false) as
1502     begin
1503       check11510(applicationIdIn   => applicationIdIn,
1504                  transactionTypeIn => transactionTypeIn);
1505       ame_api2.initializeApprovalProcess(applicationIdIn => applicationIdIn,
1506                                          transactionIdIn => transactionIdIn,
1507                                          transactionTypeIn => transactionTypeIn,
1508                                          recordApproverListIn => recordApproverListIn);
1509     exception
1510       when others then
1511           ame_util.runtimeException(packageNameIn => 'ame_api',
1512                                     routineNameIn => 'initializeApprovalProcess',
1513                                     exceptionNumberIn => sqlcode,
1514                                     exceptionStringIn => sqlerrm);
1515           raise;
1516     end initializeApprovalProcess;
1517   procedure insertApprover(applicationIdIn in integer,
1518                            transactionIdIn in varchar2,
1519                            approverIn in ame_util.approverRecord,
1520                            positionIn in integer,
1521                            orderIn in ame_util.orderRecord,
1522                            transactionTypeIn in varchar2 default null) as
1523     approver ame_util.approverRecord2;
1524     i integer;
1525     tempParameter ame_util.longestStringType;
1526     insertion ame_util.insertionRecord2;
1527     begin
1528       check11510(applicationIdIn   => applicationIdIn,
1529                  transactionTypeIn => transactionTypeIn);
1530       ame_util.apprRecordToApprRecord2(approverRecordIn => approverIn,
1531                               itemIdIn => transactionIdIn,
1532                               approverRecord2Out =>approver);
1533       ame_util.ordRecordToInsRecord2(orderRecordIn => orderIn,
1534                             transactionIdIn => transactionIdIn,
1535                             approverIn => approverIn,
1536                             insertionRecord2Out =>  insertion );
1537       approver.action_type_id := insertion.action_type_id;
1538       approver.group_or_chain_id  := insertion.group_or_chain_id ;
1539       ame_api3.insertApprover(applicationIdIn => applicationIdIn,
1540                               transactionTypeIn => transactionTypeIn,
1541                               transactionIdIn => transactionIdIn,
1542                               approverIn => approver,
1543                               positionIn => positionIn,
1544                               insertionIn =>insertion );
1545       exception
1546         when others then
1547           ame_util.runtimeException(packageNameIn => 'ame_api',
1548                                     routineNameIn => 'insertApprover',
1549                                     exceptionNumberIn => sqlcode,
1550                                     exceptionStringIn => sqlerrm);
1551           raise;
1552     end insertApprover;
1553   procedure setFirstAuthorityApprover(applicationIdIn in integer,
1554                                       transactionIdIn in varchar2,
1555                                       approverIn in ame_util.approverRecord,
1556                                       transactionTypeIn in varchar2 default null) as
1557     approver ame_util.approverRecord2;
1558     approversCount integer;
1559     approvalProcessCompleteYN ame_util.charType;
1560     approvers ame_util.approversTable2;
1561     chainToBeInserted boolean;
1562     currentActionTypeId integer;
1563     currentGroupOrChainId integer;
1564     errorCode integer;
1565     errorMessage ame_util.longestStringType;
1566     newChainFound boolean;
1567     tempCount integer;
1568     tooLateException exception;
1569     begin
1570       check11510(applicationIdIn   => applicationIdIn,
1571                  transactionTypeIn => transactionTypeIn);
1572       /* call ame_engine.UpdateTransactionState  */
1573       ame_engine.updateTransactionState(isTestTransactionIn => false,
1574                                         isLocalTransactionIn => false,
1575                                         fetchConfigVarsIn => true,
1576                                         fetchOldApproversIn => true,
1577                                         fetchInsertionsIn => true,
1578                                         fetchDeletionsIn => true,
1579                                         fetchAttributeValuesIn => true,
1580                                         fetchInactiveAttValuesIn => false,
1581                                         processProductionActionsIn => false,
1582                                         processProductionRulesIn => false,
1583                                         updateCurrentApproverListIn => true,
1584                                         updateOldApproverListIn => false,
1585                                         processPrioritiesIn => true,
1586                                         prepareItemDataIn => false,
1587                                         prepareRuleIdsIn => false,
1588                                         prepareRuleDescsIn => false,
1589                                         transactionIdIn => transactionIdIn,
1590                                         ameApplicationIdIn => null,
1591                                         fndApplicationIdIn => applicationIdIn,
1592                                         transactionTypeIdIn => transactionTypeIn );
1593       /* Get the existing approver list (approvers)  */
1594       ame_engine.getApprovers(approversOut => approvers);
1595       approversCount := approvers.count;
1596       /* Iterate thru the approver list identifying each action_type_id /group_or_chain_id
1597          for authority approvers */
1598       currentActionTypeId := null;
1599       currentGroupOrChainId := null;
1600       for i in 1 .. approvers.count loop
1601         newChainFound := false;
1602         if (approvers(i).authority = ame_util.authorityApprover and
1603             approvers(i).item_class = ame_util.headerItemClassName and
1604             approvers(i).item_id = transactionIdIn ) then
1605           if (currentActionTypeId is null and
1606               currentGroupOrChainId is null ) then
1607             currentActionTypeId := approvers(i).action_type_id;
1608             currentGroupOrChainId := approvers(i).group_or_chain_id;
1609             newChainFound := true;
1610           elsif ((currentActionTypeId = approvers(i).action_type_id) and
1611                  (currentGroupOrChainId = approvers(i).group_or_chain_id)) then
1612             newChainFound := false;  /* same chain continues */
1613           else /* A new chain or a new action type id is found */
1614             currentActionTypeId := approvers(i).action_type_id;
1615             currentGroupOrChainId := approvers(i).group_or_chain_id;
1616             newChainFound := true;
1617           end if;
1618           if newChainFound then
1619             /* check that this action_type_id uses only those approver types which
1620                correspond to orig_system 'PER'.  */
1621             chainToBeInserted := false;
1622             begin
1623               select count(*)
1624                 into tempCount
1625                 from ame_approver_type_usages
1626                 where action_type_id = currentActionTypeId
1627                   and approver_type_id not in (select approver_type_id
1628                                        from ame_approver_types
1629                                        where orig_system = ame_util.perOrigSystem) ;
1630               if tempCount = 0 then
1631                 chainToBeInserted := true;
1632               else
1633                 chainToBeInserted := false;
1634               end if;
1635             exception
1636               when no_data_found then
1637                 chainToBeInserted := true;
1638               when others then
1639                 chainToBeInserted := false;
1640             end;
1641             if chainToBeInserted then
1642               /* convert approverIn to ame_util.approverRecord2, set action_type_id
1643                  and group_or_chain_id. Call ame_api2.setFirstAuthorityApprover*/
1644               ame_util.apprRecordToApprRecord2(approverRecordIn => approverIn,
1645                                       itemIdIn => transactionIdIn,
1646                                       approverRecord2Out =>approver);
1647               approver.action_type_id := currentActionTypeId;
1648               approver.group_or_chain_id := currentGroupOrChainId;
1649               ame_api2.setFirstAuthorityApprover(applicationIdIn => applicationIdIn,
1650                                                  transactionIdIn => transactionIdIn,
1651                                                  approverIn => approver,
1652                                                  transactionTypeIn => transactionTypeIn,
1653                                                  clearChainStatusYNIn => 'Y');
1654             end if;
1655           end if;
1656         end if;
1657       end loop;
1658       exception
1659         when tooLateException then
1660           errorCode := -20001;
1661           errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
1662                                               messageNameIn => 'AME_400244_API_CHN_AUTH_TRANS');
1663           ame_util.runtimeException(packageNameIn => 'ame_api',
1664                                     routineNameIn => 'setFirstAuthorityApprover',
1665                                     exceptionNumberIn => errorCode,
1666                                     exceptionStringIn => errorMessage);
1667           raise_application_error(errorCode,
1668                                   errorMessage);
1669         when others then
1670           ame_util.runtimeException(packageNameIn => 'ame_api',
1671                                     routineNameIn => 'setFirstAuthorityApprover',
1672                                     exceptionNumberIn => sqlcode,
1673                                     exceptionStringIn => sqlerrm);
1674           raise;
1675     end setFirstAuthorityApprover;
1676   procedure updateApprovalStatus(applicationIdIn in integer,
1677                                  transactionIdIn in varchar2,
1678                                  approverIn in ame_util.approverRecord,
1679                                  transactionTypeIn in varchar2 default null,
1680                                  forwardeeIn in ame_util.approverRecord default ame_util.emptyApproverRecord) as
1681     approver ame_util.approverRecord2;
1682     forwardee ame_util.approverRecord2;
1683     begin
1684       check11510(applicationIdIn   => applicationIdIn,
1685                  transactionTypeIn => transactionTypeIn);
1686       ame_util.apprRecordToApprRecord2(approverRecordIn => approverIn,
1687                               itemIdIn => transactionIdIn,
1688                               approverRecord2Out =>approver);
1689       if (forwardeeIn.person_id is null and forwardeeIn.user_id is null) then
1690         forwardee := ame_util.emptyApproverRecord2;
1691       else
1692         ame_util.apprRecordToApprRecord2(approverRecordIn => forwardeeIn,
1693                               itemIdIn => transactionIdIn,
1694                               approverRecord2Out =>forwardee);
1695       end if;
1696       ame_api2.updateApprovalStatus(applicationIdIn => applicationIdIn,
1697                                     transactionIdIn => transactionIdIn,
1698                                     approverIn => approver,
1699                                     transactionTypeIn => transactionTypeIn,
1700                                     forwardeeIn => forwardee);
1701       exception
1702         when others then
1703           ame_util.runtimeException(packageNameIn => 'ame_api',
1704                                     routineNameIn => 'updateApprovalStatus',
1705                                     exceptionNumberIn => sqlcode,
1706                                     exceptionStringIn => sqlerrm);
1707           raise;
1708     end updateApprovalStatus;
1709   procedure updateApprovalStatus2(applicationIdIn in integer,
1710                                   transactionIdIn in varchar2,
1711                                   approvalStatusIn in varchar2,
1712                                   approverPersonIdIn in integer default null,
1713                                   approverUserIdIn in integer default null,
1714                                   transactionTypeIn in varchar2 default null,
1715                                   forwardeeIn in ame_util.approverRecord default ame_util.emptyApproverRecord,
1716                                   approvalTypeIdIn in integer default null,
1717                                   groupOrChainIdIn in integer default null,
1718                                   occurrenceIn in integer default null) as
1719     forwardee ame_util.approverRecord2;
1720     approverOrigSystem ame_util.stringType;
1721     approverOrigSystemId integer;
1722     approverName ame_util.stringType;
1723     begin
1724       check11510(applicationIdIn   => applicationIdIn,
1725                  transactionTypeIn => transactionTypeIn);
1726       if approverPersonIdIn is not null then
1727         approverOrigSystem := ame_util.perOrigSystem;
1728         approverOrigSystemId := approverPersonIdIn;
1729       else
1730         approverOrigSystem := ame_util.fndUserOrigSystem;
1731         approverOrigSystemId := approverUserIdIn;
1732       end if;
1733       approverName := ame_approver_type_pkg.getWfRolesName(origSystemIn => approverOrigSystem,
1734                                              origSystemIdIn => approverOrigSystemId);
1735       if (forwardeeIn.person_id is null and forwardeeIn.user_id is null) then
1736         forwardee := ame_util.emptyApproverRecord2;
1737       else
1738         ame_util.apprRecordToApprRecord2(approverRecordIn => forwardeeIn,
1739                               itemIdIn => transactionIdIn,
1740                               approverRecord2Out =>forwardee);
1741       end if;
1742        ame_api2.updateApprovalStatus2(applicationIdIn => applicationIdIn,
1743                                       transactionTypeIn => transactionTypeIn,
1744                                       transactionIdIn => transactionIdIn,
1745                                       approvalStatusIn => approvalStatusIn,
1746                                       approverNameIn=> approverName,
1747                                       itemClassIn => ame_util.headerItemClassName,
1748                                       itemIdIn => transactionIdIn,
1749                                       actionTypeIdIn => approvalTypeIdIn,
1750                                       groupOrChainIdIn => groupOrChainIdIn,
1751                                       occurrenceIn => occurrenceIn,
1752                                       forwardeeIn => forwardee);
1753       exception
1754         when others then
1755           ame_util.runtimeException(packageNameIn => 'ame_api',
1756                                     routineNameIn => 'updateApprovalStatus2',
1757                                     exceptionNumberIn => sqlcode,
1758                                     exceptionStringIn => sqlerrm);
1759           raise;
1760     end updateApprovalStatus2;
1761 end ame_api;