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