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