[Home] [Help]
PACKAGE BODY: APPS.AME_AG_HANDLERS
Source
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;
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 votingRegimeIn => votingRegimes(tempIndex));
123 /*
124 The engine will set tempApprover.approver_order_number; leave them null here.
125 */
126 ame_engine.addApprover(approverIn => tempApprover);
127 end loop;
128 tempIndex := groupIds.next(tempIndex);
129 end loop;
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',
139 routineNameIn => 'handler',
140 exceptionNumberIn => 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;
150 end handler;
151 procedure eliminateDuplicates as
152 begin
153 for i in 2 .. groupIds.count loop
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);
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);
172 groupOrderNumbers.delete(i - 1);
173 ruleIds.delete(i - 1);
174 parameters.delete(i - 1);
175 parameterTwos.delete(i - 1);
176 sources.delete(i - 1);
177 votingRegimes.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;
187 end eliminateDuplicates;
188 end ame_ag_handlers;