1: package body ame_manager_final_handler as
2: /* $Header: ameemfha.pkb 120.6 2011/05/18 11:24:26 nchinnam ship $ */
3: /* package variables */
4: approverCategories ame_util.charList;
5: managerFound boolean;
6: parametersCount integer;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
3: /* package variables */
4: approverCategories ame_util.charList;
5: managerFound boolean;
6: parametersCount integer;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
9: parameterSigns ame_util.charList;
10: ruleIds ame_util.idList;
11: ruleSatisfiedYN ame_util.charList;
4: approverCategories ame_util.charList;
5: managerFound boolean;
6: parametersCount integer;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
9: parameterSigns ame_util.charList;
10: ruleIds ame_util.idList;
11: ruleSatisfiedYN ame_util.charList;
12: threshholdJobLevel integer;
5: managerFound boolean;
6: parametersCount integer;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
9: parameterSigns ame_util.charList;
10: ruleIds ame_util.idList;
11: ruleSatisfiedYN ame_util.charList;
12: threshholdJobLevel integer;
13: topDogFound boolean;
6: parametersCount integer;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
9: parameterSigns ame_util.charList;
10: ruleIds ame_util.idList;
11: ruleSatisfiedYN ame_util.charList;
12: threshholdJobLevel integer;
13: topDogFound boolean;
14: topDogPersonId integer;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
9: parameterSigns ame_util.charList;
10: ruleIds ame_util.idList;
11: ruleSatisfiedYN ame_util.charList;
12: threshholdJobLevel integer;
13: topDogFound boolean;
14: topDogPersonId integer;
15: /* forward declarations */
39: sourceOut out nocopy varchar2,
40: hasFinalAuthorityYNOut out nocopy varchar2,
41: supervisorJobLevelOut out nocopy integer,
42: nextSupervisorIdOut out nocopy integer) as
43: category ame_util.charType;
44: errorCode integer;
45: errorMessage ame_util.longestStringType;
46: hasFinalAuthorityYN ame_util.charType;
47: noSupervisorException exception;
41: supervisorJobLevelOut out nocopy integer,
42: nextSupervisorIdOut out nocopy integer) as
43: category ame_util.charType;
44: errorCode integer;
45: errorMessage ame_util.longestStringType;
46: hasFinalAuthorityYN ame_util.charType;
47: noSupervisorException exception;
48: personDisplayName ame_util.longStringType;
49: source ame_util.longStringType;
42: nextSupervisorIdOut out nocopy integer) as
43: category ame_util.charType;
44: errorCode integer;
45: errorMessage ame_util.longestStringType;
46: hasFinalAuthorityYN ame_util.charType;
47: noSupervisorException exception;
48: personDisplayName ame_util.longStringType;
49: source ame_util.longStringType;
50: supervisorJobLevel integer;
44: errorCode integer;
45: errorMessage ame_util.longestStringType;
46: hasFinalAuthorityYN ame_util.charType;
47: noSupervisorException exception;
48: personDisplayName ame_util.longStringType;
49: source ame_util.longStringType;
50: supervisorJobLevel integer;
51: tempRuleRequiresApprover boolean;
52: tempRuleSatisfied boolean;
45: errorMessage ame_util.longestStringType;
46: hasFinalAuthorityYN ame_util.charType;
47: noSupervisorException exception;
48: personDisplayName ame_util.longStringType;
49: source ame_util.longStringType;
50: supervisorJobLevel integer;
51: tempRuleRequiresApprover boolean;
52: tempRuleSatisfied boolean;
53: begin
71: B. Otherwise, the rule requires the input approver only if the approver
72: does <
73: that an approver satisfies a rule, but their supervisor has a lower
74: job level that does not satisfy the rule.)
75: 4. An approver's category is ame_util.approvalApproverCategory if any of the
76: rule usages requiring the approver is of that category; otherwise the
77: approver's category is ame_util.fyiApproverCategory.
78: */
79: category := ame_util.fyiApproverCategory;
73: that an approver satisfies a rule, but their supervisor has a lower
74: job level that does not satisfy the rule.)
75: 4. An approver's category is ame_util.approvalApproverCategory if any of the
76: rule usages requiring the approver is of that category; otherwise the
77: approver's category is ame_util.fyiApproverCategory.
78: */
79: category := ame_util.fyiApproverCategory;
80: hasFinalAuthorityYN := ame_util.booleanTrue;
81: for i in 1 .. parametersCount loop
75: 4. An approver's category is ame_util.approvalApproverCategory if any of the
76: rule usages requiring the approver is of that category; otherwise the
77: approver's category is ame_util.fyiApproverCategory.
78: */
79: category := ame_util.fyiApproverCategory;
80: hasFinalAuthorityYN := ame_util.booleanTrue;
81: for i in 1 .. parametersCount loop
82: /* Determine whether the approver satisfies the current rule. */
83: if(personIdIn = topDogPersonId) then
76: rule usages requiring the approver is of that category; otherwise the
77: approver's category is ame_util.fyiApproverCategory.
78: */
79: category := ame_util.fyiApproverCategory;
80: hasFinalAuthorityYN := ame_util.booleanTrue;
81: for i in 1 .. parametersCount loop
82: /* Determine whether the approver satisfies the current rule. */
83: if(personIdIn = topDogPersonId) then
84: tempRuleSatisfied := true;
106: end if;
107: end if;
108: /* Update hasFinalAuthorityYN as needed. */
109: if(not tempRuleSatisfied and
110: hasFinalAuthorityYN = ame_util.booleanTrue) then
111: hasFinalAuthorityYN := ame_util.booleanFalse;
112: end if;
113: /* Determine whether the current rule requires the approver. */
114: tempRuleRequiresApprover := false;
107: end if;
108: /* Update hasFinalAuthorityYN as needed. */
109: if(not tempRuleSatisfied and
110: hasFinalAuthorityYN = ame_util.booleanTrue) then
111: hasFinalAuthorityYN := ame_util.booleanFalse;
112: end if;
113: /* Determine whether the current rule requires the approver. */
114: tempRuleRequiresApprover := false;
115: if(ruleSatisfiedYN(i) = ame_util.booleanTrue) then
111: hasFinalAuthorityYN := ame_util.booleanFalse;
112: end if;
113: /* Determine whether the current rule requires the approver. */
114: tempRuleRequiresApprover := false;
115: if(ruleSatisfiedYN(i) = ame_util.booleanTrue) then
116: if(not tempRuleSatisfied) then
117: tempRuleRequiresApprover := true;
118: end if;
119: else
118: end if;
119: else
120: tempRuleRequiresApprover := true;
121: if(tempRuleSatisfied) then
122: ruleSatisfiedYN(i) := ame_util.booleanTrue;
123: end if;
124: end if;
125: if(tempRuleRequiresApprover) then
126: /* Update source. */
123: end if;
124: end if;
125: if(tempRuleRequiresApprover) then
126: /* Update source. */
127: ame_util.appendRuleIdToSource(ruleIdIn => ruleIds(i),
128: sourceInOut => source);
129: /* Update category as needed. */
130: if(category = ame_util.fyiApproverCategory and
131: approverCategories(i) = ame_util.approvalApproverCategory) then
126: /* Update source. */
127: ame_util.appendRuleIdToSource(ruleIdIn => ruleIds(i),
128: sourceInOut => source);
129: /* Update category as needed. */
130: if(category = ame_util.fyiApproverCategory and
131: approverCategories(i) = ame_util.approvalApproverCategory) then
132: category := ame_util.approvalApproverCategory;
133: end if;
134: end if;
127: ame_util.appendRuleIdToSource(ruleIdIn => ruleIds(i),
128: sourceInOut => source);
129: /* Update category as needed. */
130: if(category = ame_util.fyiApproverCategory and
131: approverCategories(i) = ame_util.approvalApproverCategory) then
132: category := ame_util.approvalApproverCategory;
133: end if;
134: end if;
135: end loop;
128: sourceInOut => source);
129: /* Update category as needed. */
130: if(category = ame_util.fyiApproverCategory and
131: approverCategories(i) = ame_util.approvalApproverCategory) then
132: category := ame_util.approvalApproverCategory;
133: end if;
134: end if;
135: end loop;
136: categoryOut := category;
138: sourceOut := source;
139: exception
140: when noSupervisorException then
141: personDisplayName := ame_approver_type_pkg.getApproverDisplayName2(
142: origSystemIn => ame_util.perOrigSystem,
143: origSystemIdIn => personIdIn );
144: errorCode := -20208;
145: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
146: messageNameIn => 'AME_400297_HAN_LACK_SPVR',
141: personDisplayName := ame_approver_type_pkg.getApproverDisplayName2(
142: origSystemIn => ame_util.perOrigSystem,
143: origSystemIdIn => personIdIn );
144: errorCode := -20208;
145: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
146: messageNameIn => 'AME_400297_HAN_LACK_SPVR',
147: tokenNameOneIn => 'FIRST_NAME',
148: tokenValueOneIn => personDisplayName,
149: tokenNameTwoIn => 'LAST_NAME',
149: tokenNameTwoIn => 'LAST_NAME',
150: tokenValueTwoIn => null ,
151: tokenNameThreeIn => 'OTHER_NAME',
152: tokenValueThreeIn => null );
153: ame_util.runtimeException(packageNameIn => 'ame_manager_final_handler',
154: routineNameIn => 'getCatSourceAndAuthority',
155: exceptionNumberIn => errorCode,
156: exceptionStringIn => errorMessage);
157: raise_application_error(errorCode,
159: when others then
160: categoryOut := null;
161: hasFinalAuthorityYNOut := null;
162: sourceOut := null;
163: ame_util.runtimeException(packageNameIn => 'ame_manager_final_handler',
164: routineNameIn => 'getCatSourceAndAuthority',
165: exceptionNumberIn => sqlcode,
166: exceptionStringIn => sqlerrm);
167: raise;
167: raise;
168: end getCatSourceAndAuthority;
169: procedure handler as
170: checkForInsertee boolean;
171: COAInsertee ame_util.approverRecord2;
172: errorCode integer;
173: errorMessage ame_util.longestStringType;
174: finalAuthorityApproverCategory ame_util.charType;
175: finalAuthorityFound boolean;
169: procedure handler as
170: checkForInsertee boolean;
171: COAInsertee ame_util.approverRecord2;
172: errorCode integer;
173: errorMessage ame_util.longestStringType;
174: finalAuthorityApproverCategory ame_util.charType;
175: finalAuthorityFound boolean;
176: finalAuthoritySource ame_util.longStringType;
177: firstApproverSource ame_util.longStringType;
170: checkForInsertee boolean;
171: COAInsertee ame_util.approverRecord2;
172: errorCode integer;
173: errorMessage ame_util.longestStringType;
174: finalAuthorityApproverCategory ame_util.charType;
175: finalAuthorityFound boolean;
176: finalAuthoritySource ame_util.longStringType;
177: firstApproverSource ame_util.longStringType;
178: includeAllJobLevelApprovers boolean;
172: errorCode integer;
173: errorMessage ame_util.longestStringType;
174: finalAuthorityApproverCategory ame_util.charType;
175: finalAuthorityFound boolean;
176: finalAuthoritySource ame_util.longStringType;
177: firstApproverSource ame_util.longStringType;
178: includeAllJobLevelApprovers boolean;
179: noSupervisorException exception;
180: nullFirstIdException exception;
173: errorMessage ame_util.longestStringType;
174: finalAuthorityApproverCategory ame_util.charType;
175: finalAuthorityFound boolean;
176: finalAuthoritySource ame_util.longStringType;
177: firstApproverSource ame_util.longStringType;
178: includeAllJobLevelApprovers boolean;
179: noSupervisorException exception;
180: nullFirstIdException exception;
181: personDisplayName ame_util.longStringType;
177: firstApproverSource ame_util.longStringType;
178: includeAllJobLevelApprovers boolean;
179: noSupervisorException exception;
180: nullFirstIdException exception;
181: personDisplayName ame_util.longStringType;
182: prevApprover ame_util.approverRecord2;
183: requestorId integer;
184: startingPointId integer;
185: tempApprover ame_util.approverRecord2;
178: includeAllJobLevelApprovers boolean;
179: noSupervisorException exception;
180: nullFirstIdException exception;
181: personDisplayName ame_util.longStringType;
182: prevApprover ame_util.approverRecord2;
183: requestorId integer;
184: startingPointId integer;
185: tempApprover ame_util.approverRecord2;
186: tempHasFinalAuthorityYN ame_util.charType;
181: personDisplayName ame_util.longStringType;
182: prevApprover ame_util.approverRecord2;
183: requestorId integer;
184: startingPointId integer;
185: tempApprover ame_util.approverRecord2;
186: tempHasFinalAuthorityYN ame_util.charType;
187: tempJobLevel integer;
188: tempMemberOrderNumber integer;
189: tempOldJobLevel integer;
182: prevApprover ame_util.approverRecord2;
183: requestorId integer;
184: startingPointId integer;
185: tempApprover ame_util.approverRecord2;
186: tempHasFinalAuthorityYN ame_util.charType;
187: tempJobLevel integer;
188: tempMemberOrderNumber integer;
189: tempOldJobLevel integer;
190: tempSupervisorId integer;
190: tempSupervisorId integer;
191: tempSupervisorJobLevel integer;
192: tempNextSupervisorId integer;
193: topDogRequestorException exception;
194: votingRegimeType ame_util.stringType;
195: firstAuthInsExists boolean := false;
196: coaInsAuthForward boolean := false;
197: l_error_code number;
198: begin
199: finalAuthorityApproverCategory := null;
200: errorCode := -20232;
201: finalAuthoritySource := null;
202: includeAllJobLevelApprovers :=
203: ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.includeAllApproversAttribute) =
204: ame_util.booleanAttributeTrue;
205: /* Populate some of the package variables. */
206: managerFound := false;
207: topDogPersonId := to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.topSupPersonIdAttribute));
200: errorCode := -20232;
201: finalAuthoritySource := null;
202: includeAllJobLevelApprovers :=
203: ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.includeAllApproversAttribute) =
204: ame_util.booleanAttributeTrue;
205: /* Populate some of the package variables. */
206: managerFound := false;
207: topDogPersonId := to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.topSupPersonIdAttribute));
208: /* Set the fields in tempApprover that are constant for the entire handler cycle. */
203: ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.includeAllApproversAttribute) =
204: ame_util.booleanAttributeTrue;
205: /* Populate some of the package variables. */
206: managerFound := false;
207: topDogPersonId := to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.topSupPersonIdAttribute));
208: /* Set the fields in tempApprover that are constant for the entire handler cycle. */
209: tempApprover.orig_system := ame_util.perOrigSystem;
210: tempApprover.authority := ame_util.authorityApprover;
211: tempApprover.action_type_id := ame_engine.getHandlerActionTypeId;
205: /* Populate some of the package variables. */
206: managerFound := false;
207: topDogPersonId := to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.topSupPersonIdAttribute));
208: /* Set the fields in tempApprover that are constant for the entire handler cycle. */
209: tempApprover.orig_system := ame_util.perOrigSystem;
210: tempApprover.authority := ame_util.authorityApprover;
211: tempApprover.action_type_id := ame_engine.getHandlerActionTypeId;
212: tempApprover.item_class := ame_engine.getHandlerItemClassName;
213: tempApprover.item_id := ame_engine.getHandlerItemId;
206: managerFound := false;
207: topDogPersonId := to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.topSupPersonIdAttribute));
208: /* Set the fields in tempApprover that are constant for the entire handler cycle. */
209: tempApprover.orig_system := ame_util.perOrigSystem;
210: tempApprover.authority := ame_util.authorityApprover;
211: tempApprover.action_type_id := ame_engine.getHandlerActionTypeId;
212: tempApprover.item_class := ame_engine.getHandlerItemClassName;
213: tempApprover.item_id := ame_engine.getHandlerItemId;
214: tempApprover.item_class_order_number := ame_engine.getHandlerItemClassOrderNumber;
239: sourceOut => COAInsertee.source);
240: if COAInsertee.name is null then
241: /* Fetch some of the required attributes. */
242: startingPointId :=
243: to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.jobLevelStartingPointAttribute));
244: if(startingPointId is null) then
245: requestorId :=
246: to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.transactionRequestorAttribute));
247: if (requestorId is null) then
242: startingPointId :=
243: to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.jobLevelStartingPointAttribute));
244: if(startingPointId is null) then
245: requestorId :=
246: to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.transactionRequestorAttribute));
247: if (requestorId is null) then
248: raise nullFirstIdException;
249: end if;
250: tempApprover.orig_system_id := requestorId;
250: tempApprover.orig_system_id := requestorId;
251: else
252: tempApprover.orig_system_id := startingPointId;
253: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
254: origSystemIn => ame_util.perOrigSystem,
255: origSystemIdIn => tempApprover.orig_system_id,
256: nameOut => tempApprover.name,
257: displayNameOut => tempApprover.display_name);
258: end if;
255: origSystemIdIn => tempApprover.orig_system_id,
256: nameOut => tempApprover.name,
257: displayNameOut => tempApprover.display_name);
258: end if;
259: tempApprover.api_insertion := ame_util.oamGenerated;
260: else
261: tempApprover.name := COAInsertee.name;
262: tempApprover.orig_system := COAInsertee.orig_system;
263: tempApprover.orig_system_id := COAInsertee.orig_system_id;
262: tempApprover.orig_system := COAInsertee.orig_system;
263: tempApprover.orig_system_id := COAInsertee.orig_system_id;
264: tempApprover.display_name := COAInsertee.display_name;
265: firstApproverSource := COAInsertee.source;
266: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
267: firstAuthInsExists := true;
268: end if;
269: /* The threshhold Job level is the job level of this tempApprover */
270: ame_absolute_job_level_handler.getJobLevelAndSupervisor(personIdIn => tempApprover.orig_system_id,
273: threshholdJobLevel := tempJobLevel;
274: parametersCount := parameters.count;
275: parseAndSortRules;
276: for i in 1 .. ruleIds.count loop
277: ruleSatisfiedYN(i) := ame_util.booleanFalse;
278: end loop;
279: /*
280: Check whether self-approval is allowed. If so, check whether there is a non-default
281: starting point or a COA firstAuthority approver. If not, check whether the requestor
285: */
286: if(COAInsertee.name is null and
287: startingPointId is null )
288: then
289: if (ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.allowAutoApprovalAttribute)
290: = ame_util.booleanAttributeTrue)
291: then
292: getCatSourceAndAuthority(personIdIn => requestorId,
293: jobLevelIn => tempJobLevel,
286: if(COAInsertee.name is null and
287: startingPointId is null )
288: then
289: if (ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.allowAutoApprovalAttribute)
290: = ame_util.booleanAttributeTrue)
291: then
292: getCatSourceAndAuthority(personIdIn => requestorId,
293: jobLevelIn => tempJobLevel,
294: supervisorIdIn => tempSupervisorId,
296: sourceOut => tempApprover.source,
297: hasFinalAuthorityYNOut => tempHasFinalAuthorityYN,
298: supervisorJobLevelOut => tempSupervisorJobLevel,
299: nextSupervisorIdOut => tempNextSupervisorId);
300: if(tempHasFinalAuthorityYN = ame_util.booleanTrue) then
301: tempApprover.api_insertion := ame_util.oamGenerated;
302: tempApprover.orig_system_id := requestorId;
303: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
304: origSystemIn => ame_util.perOrigSystem,
297: hasFinalAuthorityYNOut => tempHasFinalAuthorityYN,
298: supervisorJobLevelOut => tempSupervisorJobLevel,
299: nextSupervisorIdOut => tempNextSupervisorId);
300: if(tempHasFinalAuthorityYN = ame_util.booleanTrue) then
301: tempApprover.api_insertion := ame_util.oamGenerated;
302: tempApprover.orig_system_id := requestorId;
303: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
304: origSystemIn => ame_util.perOrigSystem,
305: origSystemIdIn => tempApprover.orig_system_id,
300: if(tempHasFinalAuthorityYN = ame_util.booleanTrue) then
301: tempApprover.api_insertion := ame_util.oamGenerated;
302: tempApprover.orig_system_id := requestorId;
303: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
304: origSystemIn => ame_util.perOrigSystem,
305: origSystemIdIn => tempApprover.orig_system_id,
306: nameOut => tempApprover.name,
307: displayNameOut => tempApprover.display_name);
308: tempApprover.occurrence := ame_engine.getHandlerOccurrence(
311: itemIdIn => tempApprover.item_id,
312: actionTypeIdIn => tempApprover.action_type_id,
313: groupOrChainIdIn => tempApprover.group_or_chain_id);
314: tempApprover.member_order_number := 1;
315: tempApprover.approval_status := ame_util.approvedStatus;
316: ame_engine.addApprover(approverIn => tempApprover);
317: return;
318: end if;
319: end if;
328: else
329: tempApprover.orig_system_id := tempSupervisorId;
330: end if;
331: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
332: origSystemIn => ame_util.perOrigSystem,
333: origSystemIdIn => tempApprover.orig_system_id,
334: nameOut => tempApprover.name,
335: displayNameOut => tempApprover.display_name);
336: if tempSupervisorJobLevel is null then
342: tempJobLevel := tempSupervisorJobLevel;
343: end if;
344: end if;
345: /* Build the chain. */
346: prevApprover := ame_util.emptyApproverRecord2;
347: finalAuthorityFound := false;
348: tempMemberOrderNumber := 0; /* pre-increment */
349: errorCode := -20233;
350: loop
362: tempApprover.source := firstApproverSource;
363: firstApproverSource := null;
364: end if;
365: if(not finalAuthorityFound and
366: tempHasFinalAuthorityYN = ame_util.booleanTrue) then
367: finalAuthorityFound := true;
368: finalAuthorityApproverCategory := tempApprover.approver_category;
369: finalAuthoritySource := tempApprover.source;
370: end if;
372: finalAuthoritySource is not null ) then
373: tempApprover.approver_category := finalAuthorityApproverCategory;
374: tempApprover.source := finalAuthoritySource;
375: end if;
376: tempApprover.api_insertion := ame_util.oamGenerated;
377: /* The engine will set tempApprover.approver_order_number; leave it null here. */
378: /* Decide whether to end the chain. */
379: if(topDogFound or
380: (finalAuthorityFound and
382: /*
383: The approver is the last approver in the chain. He should get inserted into the
384: approver List */
385: tempMemberOrderNumber := tempMemberOrderNumber + 1;
386: if(votingRegimeType = ame_util.serializedVoting) then
387: tempApprover.member_order_number := tempMemberOrderNumber;
388: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
389: tempApprover.member_order_number := 1;
390: end if;
384: approver List */
385: tempMemberOrderNumber := tempMemberOrderNumber + 1;
386: if(votingRegimeType = ame_util.serializedVoting) then
387: tempApprover.member_order_number := tempMemberOrderNumber;
388: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
389: tempApprover.member_order_number := 1;
390: end if;
391: checkForInsertee := true;
392: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
389: tempApprover.member_order_number := 1;
390: end if;
391: checkForInsertee := true;
392: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
393: origSystemIn => ame_util.perOrigSystem,
394: origSystemIdIn => tempApprover.orig_system_id,
395: nameOut => tempApprover.name,
396: displayNameOut => tempApprover.display_name);
397: tempApprover.occurrence := ame_engine.getHandlerOccurrence(nameIn => tempApprover.name,
419: /*
420: The approver was the last approver in the chain. He should get inserted
421: into the approver List */
422: tempMemberOrderNumber := tempMemberOrderNumber + 1;
423: if(votingRegimeType = ame_util.serializedVoting) then
424: tempApprover.member_order_number := tempMemberOrderNumber;
425: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
426: tempApprover.member_order_number := 1;
427: end if;
421: into the approver List */
422: tempMemberOrderNumber := tempMemberOrderNumber + 1;
423: if(votingRegimeType = ame_util.serializedVoting) then
424: tempApprover.member_order_number := tempMemberOrderNumber;
425: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
426: tempApprover.member_order_number := 1;
427: end if;
428: checkForInsertee := true;
429: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
426: tempApprover.member_order_number := 1;
427: end if;
428: checkForInsertee := true;
429: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
430: origSystemIn => ame_util.perOrigSystem,
431: origSystemIdIn => tempApprover.orig_system_id,
432: nameOut => tempApprover.name,
433: displayNameOut => tempApprover.display_name);
434: tempApprover.occurrence := ame_engine.getHandlerOccurrence(nameIn => tempApprover.name,
445: the approver is the manager, if yes insert the approver in the chain */
446: if not managerFound then
447: managerFound := true;
448: tempMemberOrderNumber := tempMemberOrderNumber + 1;
449: if(votingRegimeType = ame_util.serializedVoting) then
450: tempApprover.member_order_number := tempMemberOrderNumber;
451: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
452: tempApprover.member_order_number := 1;
453: end if;
447: managerFound := true;
448: tempMemberOrderNumber := tempMemberOrderNumber + 1;
449: if(votingRegimeType = ame_util.serializedVoting) then
450: tempApprover.member_order_number := tempMemberOrderNumber;
451: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
452: tempApprover.member_order_number := 1;
453: end if;
454: checkForInsertee := true;
455: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
452: tempApprover.member_order_number := 1;
453: end if;
454: checkForInsertee := true;
455: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
456: origSystemIn => ame_util.perOrigSystem,
457: origSystemIdIn => tempApprover.orig_system_id,
458: nameOut => tempApprover.name,
459: displayNameOut => tempApprover.display_name);
460: tempApprover.occurrence := ame_engine.getHandlerOccurrence(nameIn => tempApprover.name,
467: elsif (prevApprover.approver_category is not null and
468: tempApprover.approver_category <> prevApprover.approver_category ) then
469: managerFound := true;
470: tempMemberOrderNumber := tempMemberOrderNumber + 1;
471: if(votingRegimeType = ame_util.serializedVoting) then
472: prevApprover.member_order_number := tempMemberOrderNumber;
473: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
474: prevApprover.member_order_number := 1;
475: end if;
469: managerFound := true;
470: tempMemberOrderNumber := tempMemberOrderNumber + 1;
471: if(votingRegimeType = ame_util.serializedVoting) then
472: prevApprover.member_order_number := tempMemberOrderNumber;
473: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
474: prevApprover.member_order_number := 1;
475: end if;
476: checkForInsertee := true;
477: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
474: prevApprover.member_order_number := 1;
475: end if;
476: checkForInsertee := true;
477: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
478: origSystemIn => ame_util.perOrigSystem,
479: origSystemIdIn => prevApprover.orig_system_id,
480: nameOut => prevApprover.name,
481: displayNameOut => prevApprover.display_name);
482: prevApprover.occurrence := ame_engine.getHandlerOccurrence(nameIn => prevApprover.name,
496: final authority will need to be done again. */
497: checkForInsertee := false;
498: loop
499: /* Initialize COAInsertee approverRecord2 */
500: COAInsertee := ame_util.emptyApproverRecord2;
501: /* Check if there are any COAInsertions */
502: ame_engine.getHandlerCOAInsertion(nameIn => tempApprover.name,
503: itemClassIn => tempApprover.item_class,
504: itemIdIn => tempApprover.item_id,
529: hasFinalAuthorityYNOut => tempHasFinalAuthorityYN,
530: supervisorJobLevelOut => tempSupervisorJobLevel,
531: nextSupervisorIdOut => tempNextSupervisorId);
532: tempApprover.source := COAInsertee.source;
533: tempApprover.approver_category := ame_util.approvalApproverCategory;
534: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
535: tempMemberOrderNumber := tempMemberOrderNumber + 1;
536: if(votingRegimeType = ame_util.serializedVoting) then
537: tempApprover.member_order_number := tempMemberOrderNumber;
530: supervisorJobLevelOut => tempSupervisorJobLevel,
531: nextSupervisorIdOut => tempNextSupervisorId);
532: tempApprover.source := COAInsertee.source;
533: tempApprover.approver_category := ame_util.approvalApproverCategory;
534: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
535: tempMemberOrderNumber := tempMemberOrderNumber + 1;
536: if(votingRegimeType = ame_util.serializedVoting) then
537: tempApprover.member_order_number := tempMemberOrderNumber;
538: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
532: tempApprover.source := COAInsertee.source;
533: tempApprover.approver_category := ame_util.approvalApproverCategory;
534: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
535: tempMemberOrderNumber := tempMemberOrderNumber + 1;
536: if(votingRegimeType = ame_util.serializedVoting) then
537: tempApprover.member_order_number := tempMemberOrderNumber;
538: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
539: tempApprover.member_order_number := 1;
540: end if;
534: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
535: tempMemberOrderNumber := tempMemberOrderNumber + 1;
536: if(votingRegimeType = ame_util.serializedVoting) then
537: tempApprover.member_order_number := tempMemberOrderNumber;
538: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
539: tempApprover.member_order_number := 1;
540: end if;
541: tempApprover.occurrence := ame_engine.getHandlerOccurrence(nameIn => tempApprover.name,
542: itemClassIn => tempApprover.item_class,
543: itemIdIn => tempApprover.item_id,
544: actionTypeIdIn => tempApprover.action_type_id,
545: groupOrChainIdIn => tempApprover.group_or_chain_id);
546: tempApprover.approval_status := ame_engine.getHandlerApprovalStatus(approverIn => tempApprover);
547: /* If approver has a status of ame_util.approve or ame_util.approveAndForwardStatus or
548: ame_util.nullStatus check to see if approver could have final authority */
549: if ((tempApprover.approval_status is null) or
550: (tempApprover.approval_status in
551: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
544: actionTypeIdIn => tempApprover.action_type_id,
545: groupOrChainIdIn => tempApprover.group_or_chain_id);
546: tempApprover.approval_status := ame_engine.getHandlerApprovalStatus(approverIn => tempApprover);
547: /* If approver has a status of ame_util.approve or ame_util.approveAndForwardStatus or
548: ame_util.nullStatus check to see if approver could have final authority */
549: if ((tempApprover.approval_status is null) or
550: (tempApprover.approval_status in
551: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
552: ame_util.repeatedStatus, ame_util.suppressedStatus,
547: /* If approver has a status of ame_util.approve or ame_util.approveAndForwardStatus or
548: ame_util.nullStatus check to see if approver could have final authority */
549: if ((tempApprover.approval_status is null) or
550: (tempApprover.approval_status in
551: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
552: ame_util.repeatedStatus, ame_util.suppressedStatus,
553: ame_util.beatByFirstResponderStatus, ame_util.nullStatus)) or
554: (tempApprover.approver_category = ame_util.approvalApproverCategory and
555: tempApprover.approval_status = ame_util.notifiedStatus) )
548: ame_util.nullStatus check to see if approver could have final authority */
549: if ((tempApprover.approval_status is null) or
550: (tempApprover.approval_status in
551: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
552: ame_util.repeatedStatus, ame_util.suppressedStatus,
553: ame_util.beatByFirstResponderStatus, ame_util.nullStatus)) or
554: (tempApprover.approver_category = ame_util.approvalApproverCategory and
555: tempApprover.approval_status = ame_util.notifiedStatus) )
556: then
549: if ((tempApprover.approval_status is null) or
550: (tempApprover.approval_status in
551: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
552: ame_util.repeatedStatus, ame_util.suppressedStatus,
553: ame_util.beatByFirstResponderStatus, ame_util.nullStatus)) or
554: (tempApprover.approver_category = ame_util.approvalApproverCategory and
555: tempApprover.approval_status = ame_util.notifiedStatus) )
556: then
557: if(not finalAuthorityFound and
550: (tempApprover.approval_status in
551: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
552: ame_util.repeatedStatus, ame_util.suppressedStatus,
553: ame_util.beatByFirstResponderStatus, ame_util.nullStatus)) or
554: (tempApprover.approver_category = ame_util.approvalApproverCategory and
555: tempApprover.approval_status = ame_util.notifiedStatus) )
556: then
557: if(not finalAuthorityFound and
558: tempHasFinalAuthorityYN = ame_util.booleanTrue) then
551: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
552: ame_util.repeatedStatus, ame_util.suppressedStatus,
553: ame_util.beatByFirstResponderStatus, ame_util.nullStatus)) or
554: (tempApprover.approver_category = ame_util.approvalApproverCategory and
555: tempApprover.approval_status = ame_util.notifiedStatus) )
556: then
557: if(not finalAuthorityFound and
558: tempHasFinalAuthorityYN = ame_util.booleanTrue) then
559: finalAuthorityFound := true;
554: (tempApprover.approver_category = ame_util.approvalApproverCategory and
555: tempApprover.approval_status = ame_util.notifiedStatus) )
556: then
557: if(not finalAuthorityFound and
558: tempHasFinalAuthorityYN = ame_util.booleanTrue) then
559: finalAuthorityFound := true;
560: end if;
561: end if;
562: ame_engine.addApprover(approverIn => tempApprover);
585: else
586: tempJobLevel := tempSupervisorJobLevel;
587: tempSupervisorId := tempNextSupervisorId;
588: end if;
589: ame_util.copyApproverRecord2(approverRecord2In => tempApprover,
590: approverRecord2Out => prevApprover);
591: if firstAuthInsExists then
592: ame_engine.setDeviationReasonDate(ame_approver_deviation_pkg.firstauthHandlerInsReason,null);
593: end if;
602: final authority will need to be done again. */
603: checkForInsertee := false;
604: loop
605: /* Initialize COAInsertee approverRecord2 */
606: COAInsertee := ame_util.emptyApproverRecord2;
607: /* Check if there are any COAInsertions */
608: ame_engine.getHandlerCOAInsertion(nameIn => tempApprover.name,
609: itemClassIn => tempApprover.item_class,
610: itemIdIn => tempApprover.item_id,
635: hasFinalAuthorityYNOut => tempHasFinalAuthorityYN,
636: supervisorJobLevelOut => tempSupervisorJobLevel,
637: nextSupervisorIdOut => tempNextSupervisorId);
638: tempApprover.source := COAInsertee.source;
639: tempApprover.approver_category := ame_util.approvalApproverCategory;
640: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
641: tempMemberOrderNumber := tempMemberOrderNumber + 1;
642: if(votingRegimeType = ame_util.serializedVoting) then
643: tempApprover.member_order_number := tempMemberOrderNumber;
636: supervisorJobLevelOut => tempSupervisorJobLevel,
637: nextSupervisorIdOut => tempNextSupervisorId);
638: tempApprover.source := COAInsertee.source;
639: tempApprover.approver_category := ame_util.approvalApproverCategory;
640: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
641: tempMemberOrderNumber := tempMemberOrderNumber + 1;
642: if(votingRegimeType = ame_util.serializedVoting) then
643: tempApprover.member_order_number := tempMemberOrderNumber;
644: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
638: tempApprover.source := COAInsertee.source;
639: tempApprover.approver_category := ame_util.approvalApproverCategory;
640: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
641: tempMemberOrderNumber := tempMemberOrderNumber + 1;
642: if(votingRegimeType = ame_util.serializedVoting) then
643: tempApprover.member_order_number := tempMemberOrderNumber;
644: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
645: tempApprover.member_order_number := 1;
646: end if;
640: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
641: tempMemberOrderNumber := tempMemberOrderNumber + 1;
642: if(votingRegimeType = ame_util.serializedVoting) then
643: tempApprover.member_order_number := tempMemberOrderNumber;
644: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
645: tempApprover.member_order_number := 1;
646: end if;
647: tempApprover.occurrence := ame_engine.getHandlerOccurrence(nameIn => tempApprover.name,
648: itemClassIn => tempApprover.item_class,
657: exception
658: when noSupervisorException then
659: if tempApprover.display_name is null then
660: personDisplayName := ame_approver_type_pkg.getApproverDisplayName2(
661: origSystemIn => ame_util.perOrigSystem,
662: origSystemIdIn => tempApprover.orig_system_id );
663: else
664: personDisplayName := tempApprover.display_name;
665: end if;
663: else
664: personDisplayName := tempApprover.display_name;
665: end if;
666: errorCode := -20208;
667: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
668: messageNameIn => 'AME_400297_HAN_LACK_SPVR',
669: tokenNameOneIn => 'FIRST_NAME',
670: tokenValueOneIn => personDisplayName,
671: tokenNameTwoIn => 'LAST_NAME',
671: tokenNameTwoIn => 'LAST_NAME',
672: tokenValueTwoIn => null ,
673: tokenNameThreeIn => 'OTHER_NAME',
674: tokenValueThreeIn => null );
675: ame_util.runtimeException(packageNameIn => 'ame_manager_final_handler',
676: routineNameIn => 'handler',
677: exceptionNumberIn => errorCode,
678: exceptionStringIn => errorMessage);
679: raise_application_error(errorCode,
680: errorMessage);
681: when nullFirstIdException then
682: errorCode := -20106;
683: errorMessage :=
684: ame_util.getMessage(applicationShortNameIn => 'PER',
685: messageNameIn => 'AME_400233_HAN_NO_TRANS_PER_ID');
686: ame_util.runtimeException(packageNameIn => 'ame_manager_final_handler',
687: routineNameIn => 'handler',
688: exceptionNumberIn => errorCode,
682: errorCode := -20106;
683: errorMessage :=
684: ame_util.getMessage(applicationShortNameIn => 'PER',
685: messageNameIn => 'AME_400233_HAN_NO_TRANS_PER_ID');
686: ame_util.runtimeException(packageNameIn => 'ame_manager_final_handler',
687: routineNameIn => 'handler',
688: exceptionNumberIn => errorCode,
689: exceptionStringIn => errorMessage);
690: raise_application_error(errorCode,
690: raise_application_error(errorCode,
691: errorMessage);
692: when topDogRequestorException then
693: errorCode := -20111;
694: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
695: messageNameIn => 'AME_400421_REQ_CANNOT_APPROVE');
696: ame_util.runtimeException(packageNameIn => 'ame_manager_final_handler',
697: routineNameIn => 'handler',
698: exceptionNumberIn => errorCode,
692: when topDogRequestorException then
693: errorCode := -20111;
694: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
695: messageNameIn => 'AME_400421_REQ_CANNOT_APPROVE');
696: ame_util.runtimeException(packageNameIn => 'ame_manager_final_handler',
697: routineNameIn => 'handler',
698: exceptionNumberIn => errorCode,
699: exceptionStringIn => errorMessage);
700: raise_application_error(errorCode,
699: exceptionStringIn => errorMessage);
700: raise_application_error(errorCode,
701: errorMessage);
702: when others then
703: ame_util.runtimeException(packageNameIn => 'ame_manager_final_handler',
704: routineNameIn => 'handler',
705: exceptionNumberIn => sqlcode,
706: exceptionStringIn => sqlerrm);
707: l_error_code := sqlcode;
705: exceptionNumberIn => sqlcode,
706: exceptionStringIn => sqlerrm);
707: l_error_code := sqlcode;
708: if l_error_code = -20213 then
709: errorMessage := ame_util.getMessage(applicationShortNameIn =>'PER',
710: messageNameIn => 'AME_400834_INV_HANDLR_APR',
711: tokenNameOneIn => 'ACTION_TYPE_NAME',
712: tokenValueOneIn => ame_engine.getActionTypeName(tempApprover.action_type_id),
713: tokenNameTwoIn => 'ORIG_SYSTEM',
710: messageNameIn => 'AME_400834_INV_HANDLR_APR',
711: tokenNameOneIn => 'ACTION_TYPE_NAME',
712: tokenValueOneIn => ame_engine.getActionTypeName(tempApprover.action_type_id),
713: tokenNameTwoIn => 'ORIG_SYSTEM',
714: tokenValueTwoIn => ame_util.perOrigSystem,
715: tokenNameThreeIn => 'ORIG_SYSEM_ID',
716: tokenValueThreeIn => tempApprover.orig_system_id);
717: raise_application_error(errorCode,errorMessage);
718: end if;
720: end handler;
721: procedure parseAndSortRules as
722: badParameterException exception;
723: errorCode integer;
724: errorMessage ame_util.longestStringType;
725: tempCategory ame_util.charType;
726: tempLength integer;
727: tempNumber integer;
728: tempRuleId integer;
721: procedure parseAndSortRules as
722: badParameterException exception;
723: errorCode integer;
724: errorMessage ame_util.longestStringType;
725: tempCategory ame_util.charType;
726: tempLength integer;
727: tempNumber integer;
728: tempRuleId integer;
729: tempSign ame_util.charType;
725: tempCategory ame_util.charType;
726: tempLength integer;
727: tempNumber integer;
728: tempRuleId integer;
729: tempSign ame_util.charType;
730: upperLimit integer;
731: begin
732: /* Parse. */
733: for i in 1 .. parametersCount loop
773: end loop;
774: exception
775: when badParameterException then
776: errorCode := -20001;
777: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
778: messageNameIn => 'AME_400234_HAN_ACT_PAR_SIGN');
779: ame_util.runtimeException(packageNameIn => 'ame_manager_final_handler',
780: routineNameIn => 'parseAndSortRules',
781: exceptionNumberIn => errorCode,
775: when badParameterException then
776: errorCode := -20001;
777: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
778: messageNameIn => 'AME_400234_HAN_ACT_PAR_SIGN');
779: ame_util.runtimeException(packageNameIn => 'ame_manager_final_handler',
780: routineNameIn => 'parseAndSortRules',
781: exceptionNumberIn => errorCode,
782: exceptionStringIn => errorMessage);
783: raise_application_error(errorCode,
782: exceptionStringIn => errorMessage);
783: raise_application_error(errorCode,
784: errorMessage);
785: when others then
786: ame_util.runtimeException(packageNameIn => 'ame_manager_final_handler',
787: routineNameIn => 'parseAndSortRules',
788: exceptionNumberIn => sqlcode,
789: exceptionStringIn => sqlerrm);
790: raise;