DBA Data[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;