1: package body ame_ag_handlers as
2: /* $Header: ameeagha.pkb 120.1 2006/12/26 13:08:46 avarri noship $ */
3: /* package variables */
4: approverCategories ame_util.charList;
5: groupIds ame_util.idList;
6: groupOrderNumbers ame_util.idList;
7: ruleIds ame_util.idList;
8: parameters ame_util.stringList;
1: package body ame_ag_handlers as
2: /* $Header: ameeagha.pkb 120.1 2006/12/26 13:08:46 avarri noship $ */
3: /* package variables */
4: approverCategories ame_util.charList;
5: groupIds ame_util.idList;
6: groupOrderNumbers ame_util.idList;
7: ruleIds ame_util.idList;
8: parameters ame_util.stringList;
9: parameterTwos ame_util.stringList;
2: /* $Header: ameeagha.pkb 120.1 2006/12/26 13:08:46 avarri noship $ */
3: /* package variables */
4: approverCategories ame_util.charList;
5: groupIds ame_util.idList;
6: groupOrderNumbers ame_util.idList;
7: ruleIds ame_util.idList;
8: parameters ame_util.stringList;
9: parameterTwos ame_util.stringList;
10: sources ame_util.longStringList;
3: /* package variables */
4: approverCategories ame_util.charList;
5: groupIds ame_util.idList;
6: groupOrderNumbers ame_util.idList;
7: ruleIds ame_util.idList;
8: parameters ame_util.stringList;
9: parameterTwos ame_util.stringList;
10: sources ame_util.longStringList;
11: votingRegimes ame_util.charList;
4: approverCategories ame_util.charList;
5: groupIds ame_util.idList;
6: groupOrderNumbers ame_util.idList;
7: ruleIds ame_util.idList;
8: parameters ame_util.stringList;
9: parameterTwos ame_util.stringList;
10: sources ame_util.longStringList;
11: votingRegimes ame_util.charList;
12: /* forward declarations */
5: groupIds ame_util.idList;
6: groupOrderNumbers ame_util.idList;
7: ruleIds ame_util.idList;
8: parameters ame_util.stringList;
9: parameterTwos ame_util.stringList;
10: sources ame_util.longStringList;
11: votingRegimes ame_util.charList;
12: /* forward declarations */
13: procedure eliminateDuplicates;
6: groupOrderNumbers ame_util.idList;
7: ruleIds ame_util.idList;
8: parameters ame_util.stringList;
9: parameterTwos ame_util.stringList;
10: sources ame_util.longStringList;
11: votingRegimes ame_util.charList;
12: /* forward declarations */
13: procedure eliminateDuplicates;
14: /* procedures */
7: ruleIds ame_util.idList;
8: parameters ame_util.stringList;
9: parameterTwos ame_util.stringList;
10: sources ame_util.longStringList;
11: votingRegimes ame_util.charList;
12: /* forward declarations */
13: procedure eliminateDuplicates;
14: /* procedures */
15: procedure handler as
17: currentApproverGrpMemberCount integer;
18: currentApproverGroupId integer;
19: emptyGroupException exception;
20: errorCode integer;
21: errorMessage ame_util.longestStringType;
22: tempApprover ame_util.approverRecord2;
23: tempApproverDisplayNames ame_util.longStringList;
24: tempApproverNames ame_util.longStringList;
25: tempApproverOrderNumbers ame_util.idList;
18: currentApproverGroupId integer;
19: emptyGroupException exception;
20: errorCode integer;
21: errorMessage ame_util.longestStringType;
22: tempApprover ame_util.approverRecord2;
23: tempApproverDisplayNames ame_util.longStringList;
24: tempApproverNames ame_util.longStringList;
25: tempApproverOrderNumbers ame_util.idList;
26: tempIndex integer;
19: emptyGroupException exception;
20: errorCode integer;
21: errorMessage ame_util.longestStringType;
22: tempApprover ame_util.approverRecord2;
23: tempApproverDisplayNames ame_util.longStringList;
24: tempApproverNames ame_util.longStringList;
25: tempApproverOrderNumbers ame_util.idList;
26: tempIndex integer;
27: tempOrigSystemIds ame_util.idList;
20: errorCode integer;
21: errorMessage ame_util.longestStringType;
22: tempApprover ame_util.approverRecord2;
23: tempApproverDisplayNames ame_util.longStringList;
24: tempApproverNames ame_util.longStringList;
25: tempApproverOrderNumbers ame_util.idList;
26: tempIndex integer;
27: tempOrigSystemIds ame_util.idList;
28: tempOrigSystems ame_util.stringList;
21: errorMessage ame_util.longestStringType;
22: tempApprover ame_util.approverRecord2;
23: tempApproverDisplayNames ame_util.longStringList;
24: tempApproverNames ame_util.longStringList;
25: tempApproverOrderNumbers ame_util.idList;
26: tempIndex integer;
27: tempOrigSystemIds ame_util.idList;
28: tempOrigSystems ame_util.stringList;
29: begin
23: tempApproverDisplayNames ame_util.longStringList;
24: tempApproverNames ame_util.longStringList;
25: tempApproverOrderNumbers ame_util.idList;
26: tempIndex integer;
27: tempOrigSystemIds ame_util.idList;
28: tempOrigSystems ame_util.stringList;
29: begin
30: /*
31: The engine only calls a handler if a rule requiring it exists, so we can assume that
24: tempApproverNames ame_util.longStringList;
25: tempApproverOrderNumbers ame_util.idList;
26: tempIndex integer;
27: tempOrigSystemIds ame_util.idList;
28: tempOrigSystems ame_util.stringList;
29: begin
30: /*
31: The engine only calls a handler if a rule requiring it exists, so we can assume that
32: the package variables that ame_engine.getHandlerRules initializes are nonempty.
42: /*
43: Convert the parameters to group IDs (integers), then fetch the groups' order numbers
44: and ordering modes.
45: */
46: ame_util.stringListToIdList(stringListIn => parameters,
47: idListOut => groupIds);
48: /* Bug:4491715 when get configs we sort group ids so corresponding sources and categories
49: must also be sorted */
50: ame_engine.getApprovalGroupConfigs(groupIdsInOut => groupIds,
55: /* Eliminate duplicate group-ID entries, possibly leaving the package-variable lists sparse. */
56: eliminateDuplicates;
57: /* Find the transaction allows empty approval groups or not */
58: allowEmptyGroups :=
59: ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.allowEmptyGroupAttribute)
60: = ame_util.booleanAttributeTrue;
61: /* Set the fields in tempApprover that are constant for the entire handler cycle. */
62: tempApprover.api_insertion := ame_util.oamGenerated;
63: tempApprover.authority := ame_engine.getHandlerAuthority;
56: eliminateDuplicates;
57: /* Find the transaction allows empty approval groups or not */
58: allowEmptyGroups :=
59: ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.allowEmptyGroupAttribute)
60: = ame_util.booleanAttributeTrue;
61: /* Set the fields in tempApprover that are constant for the entire handler cycle. */
62: tempApprover.api_insertion := ame_util.oamGenerated;
63: tempApprover.authority := ame_engine.getHandlerAuthority;
64: tempApprover.action_type_id := ame_engine.getHandlerActionTypeId;
58: allowEmptyGroups :=
59: ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.allowEmptyGroupAttribute)
60: = ame_util.booleanAttributeTrue;
61: /* Set the fields in tempApprover that are constant for the entire handler cycle. */
62: tempApprover.api_insertion := ame_util.oamGenerated;
63: tempApprover.authority := ame_engine.getHandlerAuthority;
64: tempApprover.action_type_id := ame_engine.getHandlerActionTypeId;
65: tempApprover.item_class := ame_engine.getHandlerItemClassName;
66: tempApprover.item_id := ame_engine.getHandlerItemId;
110: actionTypeIdIn => tempApprover.action_type_id,
111: groupOrChainIdIn => tempApprover.group_or_chain_id);
112: tempApprover.source := sources(tempIndex);
113: tempApprover.group_or_chain_order_number := groupOrderNumbers(tempIndex);
114: if(votingRegimes(tempIndex) = ame_util.orderNumberVoting) then
115: tempApprover.member_order_number := tempApproverOrderNumbers(i);
116: elsif(votingRegimes(tempIndex) = ame_util.serializedVoting) then
117: tempApprover.member_order_number := i;
118: else /* votingRegimes(i) in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
112: tempApprover.source := sources(tempIndex);
113: tempApprover.group_or_chain_order_number := groupOrderNumbers(tempIndex);
114: if(votingRegimes(tempIndex) = ame_util.orderNumberVoting) then
115: tempApprover.member_order_number := tempApproverOrderNumbers(i);
116: elsif(votingRegimes(tempIndex) = ame_util.serializedVoting) then
117: tempApprover.member_order_number := i;
118: else /* votingRegimes(i) in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
119: tempApprover.member_order_number := 1;
120: end if;
114: if(votingRegimes(tempIndex) = ame_util.orderNumberVoting) then
115: tempApprover.member_order_number := tempApproverOrderNumbers(i);
116: elsif(votingRegimes(tempIndex) = ame_util.serializedVoting) then
117: tempApprover.member_order_number := i;
118: else /* votingRegimes(i) in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
119: tempApprover.member_order_number := 1;
120: end if;
121: tempApprover.approval_status := ame_engine.getHandlerApprovalStatus(approverIn => tempApprover);
122: /*
129: exception
130: when emptyGroupException then
131: errorCode := -20001;
132: errorMessage :=
133: ame_util.getMessage(applicationShortNameIn => 'PER',
134: messageNameIn => 'AME_400229_HAN_APR_NO_MEM',
135: tokenNameOneIn => 'APPROVAL_GROUP',
136: tokenValueOneIn => ame_approval_group_pkg.getName(approvalGroupIdIn => currentApproverGroupId));
137: ame_util.runtimeException(packageNameIn => 'ame_ag_handlers',
133: ame_util.getMessage(applicationShortNameIn => 'PER',
134: messageNameIn => 'AME_400229_HAN_APR_NO_MEM',
135: tokenNameOneIn => 'APPROVAL_GROUP',
136: tokenValueOneIn => ame_approval_group_pkg.getName(approvalGroupIdIn => currentApproverGroupId));
137: ame_util.runtimeException(packageNameIn => 'ame_ag_handlers',
138: routineNameIn => 'handler',
139: exceptionNumberIn => errorCode,
140: exceptionStringIn => errorMessage);
141: raise_application_error(errorCode,
140: exceptionStringIn => errorMessage);
141: raise_application_error(errorCode,
142: errorMessage);
143: when others then
144: ame_util.runtimeException(packageNameIn => 'ame_ag_handlers',
145: routineNameIn => 'handler',
146: exceptionNumberIn => sqlcode,
147: exceptionStringIn => sqlerrm);
148: raise;
153: if(groupIds(i) = groupIds(i - 1)) then
154: /*
155: Preserve the deleted rule's ID in the preserved rule's source field, if space permits.
156: In the very unlikely event otherwise, silently omit the extra source value(s). (This
157: is the same functionality as ame_util.appendRuleIdToSource, but here we could be
158: appending several rule IDs, so we can't use that procedure.)
159: */
160: if(lengthb(sources(i - 1)) + lengthb(sources(i)) + 1 <= ame_util.longStringTypeLength) then
161: sources(i) := sources(i) || ame_util.fieldDelimiter || sources(i - 1);
156: In the very unlikely event otherwise, silently omit the extra source value(s). (This
157: is the same functionality as ame_util.appendRuleIdToSource, but here we could be
158: appending several rule IDs, so we can't use that procedure.)
159: */
160: if(lengthb(sources(i - 1)) + lengthb(sources(i)) + 1 <= ame_util.longStringTypeLength) then
161: sources(i) := sources(i) || ame_util.fieldDelimiter || sources(i - 1);
162: end if;
163: /* Make sure the dominant approver category is preserved. */
164: if(approverCategories(i) <> ame_util.approvalApproverCategory and
157: is the same functionality as ame_util.appendRuleIdToSource, but here we could be
158: appending several rule IDs, so we can't use that procedure.)
159: */
160: if(lengthb(sources(i - 1)) + lengthb(sources(i)) + 1 <= ame_util.longStringTypeLength) then
161: sources(i) := sources(i) || ame_util.fieldDelimiter || sources(i - 1);
162: end if;
163: /* Make sure the dominant approver category is preserved. */
164: if(approverCategories(i) <> ame_util.approvalApproverCategory and
165: approverCategories(i - 1) = ame_util.approvalApproverCategory) then
160: if(lengthb(sources(i - 1)) + lengthb(sources(i)) + 1 <= ame_util.longStringTypeLength) then
161: sources(i) := sources(i) || ame_util.fieldDelimiter || sources(i - 1);
162: end if;
163: /* Make sure the dominant approver category is preserved. */
164: if(approverCategories(i) <> ame_util.approvalApproverCategory and
165: approverCategories(i - 1) = ame_util.approvalApproverCategory) then
166: approverCategories(i) := ame_util.approvalApproverCategory;
167: end if;
168: /* Delete the duplicate group. */
161: sources(i) := sources(i) || ame_util.fieldDelimiter || sources(i - 1);
162: end if;
163: /* Make sure the dominant approver category is preserved. */
164: if(approverCategories(i) <> ame_util.approvalApproverCategory and
165: approverCategories(i - 1) = ame_util.approvalApproverCategory) then
166: approverCategories(i) := ame_util.approvalApproverCategory;
167: end if;
168: /* Delete the duplicate group. */
169: approverCategories.delete(i - 1);
162: end if;
163: /* Make sure the dominant approver category is preserved. */
164: if(approverCategories(i) <> ame_util.approvalApproverCategory and
165: approverCategories(i - 1) = ame_util.approvalApproverCategory) then
166: approverCategories(i) := ame_util.approvalApproverCategory;
167: end if;
168: /* Delete the duplicate group. */
169: approverCategories.delete(i - 1);
170: groupIds.delete(i - 1);
177: end if;
178: end loop;
179: exception
180: when others then
181: ame_util.runtimeException(packageNameIn => 'ame_ag_handlers',
182: routineNameIn => 'eliminateDuplicates',
183: exceptionNumberIn => sqlcode,
184: exceptionStringIn => sqlerrm);
185: raise;