1: package body ame_ag_handlers as
2: /* $Header: ameeagha.pkb 120.4 2011/05/18 11:25:36 nchinnam ship $ */
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.4 2011/05/18 11:25:36 nchinnam ship $ */
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.4 2011/05/18 11:25:36 nchinnam ship $ */
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: votingRegimeIn => votingRegimes(tempIndex));
130: exception
131: when emptyGroupException then
132: errorCode := -20104;
133: errorMessage :=
134: ame_util.getMessage(applicationShortNameIn => 'PER',
135: messageNameIn => 'AME_400229_HAN_APR_NO_MEM',
136: tokenNameOneIn => 'APPROVAL_GROUP',
137: tokenValueOneIn => ame_approval_group_pkg.getName(approvalGroupIdIn => currentApproverGroupId));
138: ame_util.runtimeException(packageNameIn => 'ame_ag_handlers',
134: ame_util.getMessage(applicationShortNameIn => 'PER',
135: messageNameIn => 'AME_400229_HAN_APR_NO_MEM',
136: tokenNameOneIn => 'APPROVAL_GROUP',
137: tokenValueOneIn => ame_approval_group_pkg.getName(approvalGroupIdIn => currentApproverGroupId));
138: ame_util.runtimeException(packageNameIn => 'ame_ag_handlers',
139: routineNameIn => 'handler',
140: exceptionNumberIn => errorCode,
141: exceptionStringIn => errorMessage);
142: raise_application_error(errorCode,
141: exceptionStringIn => errorMessage);
142: raise_application_error(errorCode,
143: errorMessage);
144: when others then
145: ame_util.runtimeException(packageNameIn => 'ame_ag_handlers',
146: routineNameIn => 'handler',
147: exceptionNumberIn => sqlcode,
148: exceptionStringIn => sqlerrm);
149: raise;
154: if(groupIds(i) = groupIds(i - 1)) then
155: /*
156: Preserve the deleted rule's ID in the preserved rule's source field, if space permits.
157: In the very unlikely event otherwise, silently omit the extra source value(s). (This
158: is the same functionality as ame_util.appendRuleIdToSource, but here we could be
159: appending several rule IDs, so we can't use that procedure.)
160: */
161: if(lengthb(sources(i - 1)) + lengthb(sources(i)) + 1 <= ame_util.longStringTypeLength) then
162: sources(i) := sources(i) || ame_util.fieldDelimiter || sources(i - 1);
157: In the very unlikely event otherwise, silently omit the extra source value(s). (This
158: is the same functionality as ame_util.appendRuleIdToSource, but here we could be
159: appending several rule IDs, so we can't use that procedure.)
160: */
161: if(lengthb(sources(i - 1)) + lengthb(sources(i)) + 1 <= ame_util.longStringTypeLength) then
162: sources(i) := sources(i) || ame_util.fieldDelimiter || sources(i - 1);
163: end if;
164: /* Make sure the dominant approver category is preserved. */
165: if(approverCategories(i) <> ame_util.approvalApproverCategory and
158: is the same functionality as ame_util.appendRuleIdToSource, but here we could be
159: appending several rule IDs, so we can't use that procedure.)
160: */
161: if(lengthb(sources(i - 1)) + lengthb(sources(i)) + 1 <= ame_util.longStringTypeLength) then
162: sources(i) := sources(i) || ame_util.fieldDelimiter || sources(i - 1);
163: end if;
164: /* Make sure the dominant approver category is preserved. */
165: if(approverCategories(i) <> ame_util.approvalApproverCategory and
166: approverCategories(i - 1) = ame_util.approvalApproverCategory) then
161: if(lengthb(sources(i - 1)) + lengthb(sources(i)) + 1 <= ame_util.longStringTypeLength) then
162: sources(i) := sources(i) || ame_util.fieldDelimiter || sources(i - 1);
163: end if;
164: /* Make sure the dominant approver category is preserved. */
165: if(approverCategories(i) <> ame_util.approvalApproverCategory and
166: approverCategories(i - 1) = ame_util.approvalApproverCategory) then
167: approverCategories(i) := ame_util.approvalApproverCategory;
168: end if;
169: /* Delete the duplicate group. */
162: sources(i) := sources(i) || ame_util.fieldDelimiter || sources(i - 1);
163: end if;
164: /* Make sure the dominant approver category is preserved. */
165: if(approverCategories(i) <> ame_util.approvalApproverCategory and
166: approverCategories(i - 1) = ame_util.approvalApproverCategory) then
167: approverCategories(i) := ame_util.approvalApproverCategory;
168: end if;
169: /* Delete the duplicate group. */
170: approverCategories.delete(i - 1);
163: end if;
164: /* Make sure the dominant approver category is preserved. */
165: if(approverCategories(i) <> ame_util.approvalApproverCategory and
166: approverCategories(i - 1) = ame_util.approvalApproverCategory) then
167: approverCategories(i) := ame_util.approvalApproverCategory;
168: end if;
169: /* Delete the duplicate group. */
170: approverCategories.delete(i - 1);
171: groupIds.delete(i - 1);
178: end if;
179: end loop;
180: exception
181: when others then
182: ame_util.runtimeException(packageNameIn => 'ame_ag_handlers',
183: routineNameIn => 'eliminateDuplicates',
184: exceptionNumberIn => sqlcode,
185: exceptionStringIn => sqlerrm);
186: raise;