[Home] [Help]
PACKAGE BODY: APPS.AME_AG_HANDLERS
Source
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;
10 sources ame_util.longStringList;
11 votingRegimes ame_util.charList;
12 /* forward declarations */
13 procedure eliminateDuplicates;
14 /* procedures */
15 procedure handler as
16 allowEmptyGroups boolean;
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;
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.
33 */
34 ame_engine.getHandlerRules(ruleIdsOut => ruleIds,
35 approverCategoriesOut => approverCategories,
36 parametersOut => parameters,
37 parameterTwosOut => parameterTwos);
38 /* Initialize the source list. */
39 for i in 1 .. ruleIds.count loop
40 sources(i) := to_char(ruleIds(i));
41 end loop;
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,
51 sourcesInOut => sources,
52 approverCategoriesInOut => approverCategories,
53 orderNumbersOut => groupOrderNumbers,
54 votingRegimesOut => votingRegimes);
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;
64 tempApprover.action_type_id := ame_engine.getHandlerActionTypeId;
65 tempApprover.item_class := ame_engine.getHandlerItemClassName;
66 tempApprover.item_id := ame_engine.getHandlerItemId;
67 tempApprover.item_class_order_number := ame_engine.getHandlerItemClassOrderNumber;
68 tempApprover.item_order_number := ame_engine.getHandlerItemOrderNumber;
69 tempApprover.sub_list_order_number := ame_engine.getHandlerSublistOrderNum;
70 tempApprover.action_type_order_number := ame_engine.getHandlerActionTypeOrderNum;
71 /*
72 /*
73 Now iterate through the sorted groups, adding their membership to the engine's
74 approver list in the group-member order dictated by the group's voting regime
75 (and possibly its members' order numbers).
76 */
77 tempIndex := groupIds.first;
78 while(tempIndex is not null) loop
79 /* Clear the group-member buffers of any previous data. */
80 tempApproverNames.delete;
81 tempApproverOrderNumbers.delete;
82 tempApproverDisplayNames.delete;
83 tempOrigSystemIds.delete;
84 tempOrigSystems.delete;
85 /* Fetch the group's membership. */
86 ame_engine.getRuntimeGroupMembers(groupIdIn => groupIds(tempIndex),
87 approverNamesOut => tempApproverNames,
88 approverOrderNumbersOut => tempApproverOrderNumbers,
89 approverDisplayNamesOut => tempApproverDisplayNames,
90 origSystemIdsOut => tempOrigSystemIds,
91 origSystemsOut => tempOrigSystems);
92 currentApproverGrpMemberCount := tempApproverNames.count;
93 currentApproverGroupId := groupIds(tempIndex);
94 /* Throw error if the current group is empty and the transaction
95 doesnt accept empty groups */
96 if(not allowEmptyGroups and currentApproverGrpMemberCount = 0 ) then
97 raise emptyGroupException;
98 end if;
99 /* Add the group's members to the approver list. */
100 for i in 1 .. tempApproverNames.count loop
101 tempApprover.name := tempApproverNames(i);
102 tempApprover.orig_system := tempOrigSystems(i);
103 tempApprover.orig_system_id := tempOrigSystemIds(i);
104 tempApprover.display_name := tempApproverDisplayNames(i);
105 tempApprover.approver_category := approverCategories(tempIndex);
106 tempApprover.group_or_chain_id := groupIds(tempIndex);
107 tempApprover.occurrence := ame_engine.getHandlerOccurrence(nameIn => tempApprover.name,
108 itemClassIn => tempApprover.item_class,
109 itemIdIn => tempApprover.item_id,
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) */
119 tempApprover.member_order_number := 1;
120 end if;
121 tempApprover.approval_status := ame_engine.getHandlerApprovalStatus(approverIn => tempApprover);
122 /*
123 The engine will set tempApprover.approver_order_number; leave them null here.
124 */
125 ame_engine.addApprover(approverIn => tempApprover);
126 end loop;
127 tempIndex := groupIds.next(tempIndex);
128 end loop;
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',
138 routineNameIn => 'handler',
139 exceptionNumberIn => 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;
149 end handler;
150 procedure eliminateDuplicates as
151 begin
152 for i in 2 .. groupIds.count loop
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);
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);
171 groupOrderNumbers.delete(i - 1);
172 ruleIds.delete(i - 1);
173 parameters.delete(i - 1);
174 parameterTwos.delete(i - 1);
175 sources.delete(i - 1);
176 votingRegimes.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;
186 end eliminateDuplicates;
187 end ame_ag_handlers;