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