1: package body ame_dual_chains_handler as
2: /* $Header: ameedcha.pkb 120.3 2007/12/20 20:02:21 prasashe noship $ */
3: /* package variables */
4: approverCategoriesDual ame_util.charList;
5: approverCategories ame_util.charList;
6: parametersCount integer;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
1: package body ame_dual_chains_handler as
2: /* $Header: ameedcha.pkb 120.3 2007/12/20 20:02:21 prasashe noship $ */
3: /* package variables */
4: approverCategoriesDual ame_util.charList;
5: approverCategories ame_util.charList;
6: parametersCount integer;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
9: parameterSigns ame_util.charList;
3: /* package variables */
4: approverCategoriesDual ame_util.charList;
5: approverCategories ame_util.charList;
6: parametersCount integer;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
9: parameterSigns ame_util.charList;
10: ruleIds ame_util.idList;
11: ruleIdsDual ame_util.idList;
4: approverCategoriesDual ame_util.charList;
5: approverCategories ame_util.charList;
6: parametersCount integer;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
9: parameterSigns ame_util.charList;
10: ruleIds ame_util.idList;
11: ruleIdsDual ame_util.idList;
12: ruleSatisfiedYN ame_util.charList;
5: approverCategories ame_util.charList;
6: parametersCount integer;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
9: parameterSigns ame_util.charList;
10: ruleIds ame_util.idList;
11: ruleIdsDual ame_util.idList;
12: ruleSatisfiedYN ame_util.charList;
13: threshholdJobLevel integer;
6: parametersCount integer;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
9: parameterSigns ame_util.charList;
10: ruleIds ame_util.idList;
11: ruleIdsDual ame_util.idList;
12: ruleSatisfiedYN ame_util.charList;
13: threshholdJobLevel integer;
14: topDogFound boolean;
7: parameterNumbers ame_util.idList;
8: parameters ame_util.stringList;
9: parameterSigns ame_util.charList;
10: ruleIds ame_util.idList;
11: ruleIdsDual ame_util.idList;
12: ruleSatisfiedYN ame_util.charList;
13: threshholdJobLevel integer;
14: topDogFound boolean;
15: topDogPersonId integer;
8: parameters ame_util.stringList;
9: parameterSigns ame_util.charList;
10: ruleIds ame_util.idList;
11: ruleIdsDual ame_util.idList;
12: ruleSatisfiedYN ame_util.charList;
13: threshholdJobLevel integer;
14: topDogFound boolean;
15: topDogPersonId integer;
16: /* forward declarations */
40: sourceOut out nocopy varchar2,
41: hasFinalAuthorityYNOut out nocopy varchar2,
42: supervisorJobLevelOut out nocopy integer,
43: nextSupervisorIdOut out nocopy integer) as
44: category ame_util.charType;
45: errorCode integer;
46: errorMessage ame_util.longestStringType;
47: hasFinalAuthorityYN ame_util.charType;
48: noSupervisorException exception;
42: supervisorJobLevelOut out nocopy integer,
43: nextSupervisorIdOut out nocopy integer) as
44: category ame_util.charType;
45: errorCode integer;
46: errorMessage ame_util.longestStringType;
47: hasFinalAuthorityYN ame_util.charType;
48: noSupervisorException exception;
49: personDisplayName ame_util.longStringType;
50: source ame_util.longStringType;
43: nextSupervisorIdOut out nocopy integer) as
44: category ame_util.charType;
45: errorCode integer;
46: errorMessage ame_util.longestStringType;
47: hasFinalAuthorityYN ame_util.charType;
48: noSupervisorException exception;
49: personDisplayName ame_util.longStringType;
50: source ame_util.longStringType;
51: supervisorJobLevel integer;
45: errorCode integer;
46: errorMessage ame_util.longestStringType;
47: hasFinalAuthorityYN ame_util.charType;
48: noSupervisorException exception;
49: personDisplayName ame_util.longStringType;
50: source ame_util.longStringType;
51: supervisorJobLevel integer;
52: tempRuleRequiresApprover boolean;
53: tempRuleSatisfied boolean;
46: errorMessage ame_util.longestStringType;
47: hasFinalAuthorityYN ame_util.charType;
48: noSupervisorException exception;
49: personDisplayName ame_util.longStringType;
50: source ame_util.longStringType;
51: supervisorJobLevel integer;
52: tempRuleRequiresApprover boolean;
53: tempRuleSatisfied boolean;
54: begin
72: B. Otherwise, the rule requires the input approver only if the approver
73: does <
74: that an approver satisfies a rule, but their supervisor has a lower
75: job level that does not satisfy the rule.)
76: 4. An approver's category is ame_util.approvalApproverCategory if any of the
77: rule usages requiring the approver is of that category; otherwise the
78: approver's category is ame_util.fyiApproverCategory.
79: */
80: category := ame_util.fyiApproverCategory;
74: that an approver satisfies a rule, but their supervisor has a lower
75: job level that does not satisfy the rule.)
76: 4. An approver's category is ame_util.approvalApproverCategory if any of the
77: rule usages requiring the approver is of that category; otherwise the
78: approver's category is ame_util.fyiApproverCategory.
79: */
80: category := ame_util.fyiApproverCategory;
81: hasFinalAuthorityYN := ame_util.booleanTrue;
82: for i in 1 .. parameterNumbers.count loop
76: 4. An approver's category is ame_util.approvalApproverCategory if any of the
77: rule usages requiring the approver is of that category; otherwise the
78: approver's category is ame_util.fyiApproverCategory.
79: */
80: category := ame_util.fyiApproverCategory;
81: hasFinalAuthorityYN := ame_util.booleanTrue;
82: for i in 1 .. parameterNumbers.count loop
83: /* Determine whether the approver satisfies the current rule. */
84: if(personIdIn = topDogPersonId) then
77: rule usages requiring the approver is of that category; otherwise the
78: approver's category is ame_util.fyiApproverCategory.
79: */
80: category := ame_util.fyiApproverCategory;
81: hasFinalAuthorityYN := ame_util.booleanTrue;
82: for i in 1 .. parameterNumbers.count loop
83: /* Determine whether the approver satisfies the current rule. */
84: if(personIdIn = topDogPersonId) then
85: topDogFound := true;
109: end if;
110: end if;
111: /* Update hasFinalAuthorityYN as needed. */
112: if(not tempRuleSatisfied and
113: hasFinalAuthorityYN = ame_util.booleanTrue) then
114: hasFinalAuthorityYN := ame_util.booleanFalse;
115: end if;
116: /* Determine whether the current rule requires the approver. */
117: tempRuleRequiresApprover := false;
110: end if;
111: /* Update hasFinalAuthorityYN as needed. */
112: if(not tempRuleSatisfied and
113: hasFinalAuthorityYN = ame_util.booleanTrue) then
114: hasFinalAuthorityYN := ame_util.booleanFalse;
115: end if;
116: /* Determine whether the current rule requires the approver. */
117: tempRuleRequiresApprover := false;
118: if(ruleSatisfiedYN(i) = ame_util.booleanTrue) then
114: hasFinalAuthorityYN := ame_util.booleanFalse;
115: end if;
116: /* Determine whether the current rule requires the approver. */
117: tempRuleRequiresApprover := false;
118: if(ruleSatisfiedYN(i) = ame_util.booleanTrue) then
119: if(not tempRuleSatisfied) then
120: tempRuleRequiresApprover := true;
121: end if;
122: else
121: end if;
122: else
123: tempRuleRequiresApprover := true;
124: if(tempRuleSatisfied) then
125: ruleSatisfiedYN(i) := ame_util.booleanTrue;
126: end if;
127: end if;
128: if(tempRuleRequiresApprover) then
129: /* Update source. */
126: end if;
127: end if;
128: if(tempRuleRequiresApprover) then
129: /* Update source. */
130: ame_util.appendRuleIdToSource(ruleIdIn => ruleIds(i),
131: sourceInOut => source);
132: /* Update category as needed. */
133: if(category = ame_util.fyiApproverCategory and
134: approverCategories(i) = ame_util.approvalApproverCategory) then
129: /* Update source. */
130: ame_util.appendRuleIdToSource(ruleIdIn => ruleIds(i),
131: sourceInOut => source);
132: /* Update category as needed. */
133: if(category = ame_util.fyiApproverCategory and
134: approverCategories(i) = ame_util.approvalApproverCategory) then
135: category := ame_util.approvalApproverCategory;
136: end if;
137: end if;
130: ame_util.appendRuleIdToSource(ruleIdIn => ruleIds(i),
131: sourceInOut => source);
132: /* Update category as needed. */
133: if(category = ame_util.fyiApproverCategory and
134: approverCategories(i) = ame_util.approvalApproverCategory) then
135: category := ame_util.approvalApproverCategory;
136: end if;
137: end if;
138: end loop;
131: sourceInOut => source);
132: /* Update category as needed. */
133: if(category = ame_util.fyiApproverCategory and
134: approverCategories(i) = ame_util.approvalApproverCategory) then
135: category := ame_util.approvalApproverCategory;
136: end if;
137: end if;
138: end loop;
139: categoryOut := category;
141: sourceOut := source;
142: exception
143: when noSupervisorException then
144: personDisplayName := ame_approver_type_pkg.getApproverDisplayName2(
145: origSystemIn => ame_util.perOrigSystem,
146: origSystemIdIn => personIdIn );
147: errorCode := -20001;
148: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
149: messageNameIn => 'AME_400297_HAN_LACK_SPVR',
144: personDisplayName := ame_approver_type_pkg.getApproverDisplayName2(
145: origSystemIn => ame_util.perOrigSystem,
146: origSystemIdIn => personIdIn );
147: errorCode := -20001;
148: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
149: messageNameIn => 'AME_400297_HAN_LACK_SPVR',
150: tokenNameOneIn => 'FIRST_NAME',
151: tokenValueOneIn => personDisplayName,
152: tokenNameTwoIn => 'LAST_NAME',
152: tokenNameTwoIn => 'LAST_NAME',
153: tokenValueTwoIn => null ,
154: tokenNameThreeIn => 'OTHER_NAME',
155: tokenValueThreeIn => null );
156: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
157: routineNameIn => 'getCatSourceAndAuthority',
158: exceptionNumberIn => errorCode,
159: exceptionStringIn => errorMessage);
160: raise_application_error(errorCode,
162: when others then
163: categoryOut := null;
164: hasFinalAuthorityYNOut := null;
165: sourceOut := null;
166: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
167: routineNameIn => 'getCatSourceAndAuthority',
168: exceptionNumberIn => sqlcode,
169: exceptionStringIn => sqlerrm);
170: raise;
169: exceptionStringIn => sqlerrm);
170: raise;
171: end getCatSourceAndAuthority;
172: procedure handler as
173: chainOrderMode ame_util.stringType;
174: COAInsertee ame_util.approverRecord2;
175: errorCode integer;
176: errorMessage ame_util.longestStringType;
177: finalAuthorityApproverCategory ame_util.charType;
170: raise;
171: end getCatSourceAndAuthority;
172: procedure handler as
173: chainOrderMode ame_util.stringType;
174: COAInsertee ame_util.approverRecord2;
175: errorCode integer;
176: errorMessage ame_util.longestStringType;
177: finalAuthorityApproverCategory ame_util.charType;
178: finalAuthorityFound boolean;
172: procedure handler as
173: chainOrderMode ame_util.stringType;
174: COAInsertee ame_util.approverRecord2;
175: errorCode integer;
176: errorMessage ame_util.longestStringType;
177: finalAuthorityApproverCategory ame_util.charType;
178: finalAuthorityFound boolean;
179: finalAuthoritySource ame_util.longStringType;
180: firstApproverSource ame_util.longStringType;
173: chainOrderMode ame_util.stringType;
174: COAInsertee ame_util.approverRecord2;
175: errorCode integer;
176: errorMessage ame_util.longestStringType;
177: finalAuthorityApproverCategory ame_util.charType;
178: finalAuthorityFound boolean;
179: finalAuthoritySource ame_util.longStringType;
180: firstApproverSource ame_util.longStringType;
181: includeAllJobLevelApprovers boolean;
175: errorCode integer;
176: errorMessage ame_util.longestStringType;
177: finalAuthorityApproverCategory ame_util.charType;
178: finalAuthorityFound boolean;
179: finalAuthoritySource ame_util.longStringType;
180: firstApproverSource ame_util.longStringType;
181: includeAllJobLevelApprovers boolean;
182: noSupervisorException exception;
183: nullFirstIdException exception;
176: errorMessage ame_util.longestStringType;
177: finalAuthorityApproverCategory ame_util.charType;
178: finalAuthorityFound boolean;
179: finalAuthoritySource ame_util.longStringType;
180: firstApproverSource ame_util.longStringType;
181: includeAllJobLevelApprovers boolean;
182: noSupervisorException exception;
183: nullFirstIdException exception;
184: nullSecondIdException exception;
183: nullFirstIdException exception;
184: nullSecondIdException exception;
185: firstStartingPointId integer;
186: oneChainException exception;
187: personDisplayName ame_util.longStringType;
188: secondStartingPointId integer;
189: tempApprover ame_util.approverRecord2;
190: tempHasFinalAuthorityYN ame_util.charType;
191: tempJobLevel integer;
185: firstStartingPointId integer;
186: oneChainException exception;
187: personDisplayName ame_util.longStringType;
188: secondStartingPointId integer;
189: tempApprover ame_util.approverRecord2;
190: tempHasFinalAuthorityYN ame_util.charType;
191: tempJobLevel integer;
192: tempMemberOrderNumber integer;
193: tempOldJobLevel integer;
186: oneChainException exception;
187: personDisplayName ame_util.longStringType;
188: secondStartingPointId integer;
189: tempApprover ame_util.approverRecord2;
190: tempHasFinalAuthorityYN ame_util.charType;
191: tempJobLevel integer;
192: tempMemberOrderNumber integer;
193: tempOldJobLevel integer;
194: tempSupervisorId integer;
193: tempOldJobLevel integer;
194: tempSupervisorId integer;
195: tempSupervisorJobLevel integer;
196: tempNextSupervisorId integer;
197: votingRegimeType ame_util.stringType;
198: firstAuthInsExists boolean := false;
199: coaInsAuthForward boolean := false;
200: begin
201: includeAllJobLevelApprovers :=
198: firstAuthInsExists boolean := false;
199: coaInsAuthForward boolean := false;
200: begin
201: includeAllJobLevelApprovers :=
202: ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.includeAllApproversAttribute) =
203: ame_util.booleanAttributeTrue;
204: /* Populate some of the package variables. */
205: topDogPersonId := to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.topSupPersonIdAttribute));
206: /* Set the fields in tempApprover that are constant for the entire handler cycle. */
199: coaInsAuthForward boolean := false;
200: begin
201: includeAllJobLevelApprovers :=
202: ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.includeAllApproversAttribute) =
203: ame_util.booleanAttributeTrue;
204: /* Populate some of the package variables. */
205: topDogPersonId := to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.topSupPersonIdAttribute));
206: /* Set the fields in tempApprover that are constant for the entire handler cycle. */
207: tempApprover.orig_system := ame_util.perOrigSystem;
201: includeAllJobLevelApprovers :=
202: ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.includeAllApproversAttribute) =
203: ame_util.booleanAttributeTrue;
204: /* Populate some of the package variables. */
205: topDogPersonId := to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.topSupPersonIdAttribute));
206: /* Set the fields in tempApprover that are constant for the entire handler cycle. */
207: tempApprover.orig_system := ame_util.perOrigSystem;
208: tempApprover.authority := ame_util.authorityApprover;
209: tempApprover.action_type_id := ame_engine.getHandlerActionTypeId;
203: ame_util.booleanAttributeTrue;
204: /* Populate some of the package variables. */
205: topDogPersonId := to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.topSupPersonIdAttribute));
206: /* Set the fields in tempApprover that are constant for the entire handler cycle. */
207: tempApprover.orig_system := ame_util.perOrigSystem;
208: tempApprover.authority := ame_util.authorityApprover;
209: tempApprover.action_type_id := ame_engine.getHandlerActionTypeId;
210: tempApprover.item_class := ame_engine.getHandlerItemClassName;
211: tempApprover.item_id := ame_engine.getHandlerItemId;
204: /* Populate some of the package variables. */
205: topDogPersonId := to_number(ame_engine.getHeaderAttValue2(attributeNameIn => ame_util.topSupPersonIdAttribute));
206: /* Set the fields in tempApprover that are constant for the entire handler cycle. */
207: tempApprover.orig_system := ame_util.perOrigSystem;
208: tempApprover.authority := ame_util.authorityApprover;
209: tempApprover.action_type_id := ame_engine.getHandlerActionTypeId;
210: tempApprover.item_class := ame_engine.getHandlerItemClassName;
211: tempApprover.item_id := ame_engine.getHandlerItemId;
212: tempApprover.item_class_order_number := ame_engine.getHandlerItemClassOrderNumber;
244: if chainCounter = 1 then
245: /* Fetch the required attributes. */
246: firstStartingPointId :=
247: to_number(ame_engine.getHeaderAttValue2(attributeNameIn =>
248: ame_util.firstStartingPointAttribute));
249: if(firstStartingPointId is null ) then
250: raise nullFirstIdException;
251: end if;
252: tempApprover.orig_system_id := firstStartingPointId;
253: else /* Chain is 2*/
254: /* Fetch the required attributes. */
255: secondStartingPointId :=
256: to_number(ame_engine.getHeaderAttValue2(attributeNameIn =>
257: ame_util.secondStartingPointAttribute));
258: if( secondStartingPointId is null) then
259: raise nullSecondIdException;
260: end if;
261: tempApprover.orig_system_id :=secondStartingPointId ;
259: raise nullSecondIdException;
260: end if;
261: tempApprover.orig_system_id :=secondStartingPointId ;
262: end if;
263: tempApprover.api_insertion := ame_util.oamGenerated;
264: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
265: origSystemIn => ame_util.perOrigSystem,
266: origSystemIdIn => tempApprover.orig_system_id,
267: nameOut => tempApprover.name,
261: tempApprover.orig_system_id :=secondStartingPointId ;
262: end if;
263: tempApprover.api_insertion := ame_util.oamGenerated;
264: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
265: origSystemIn => ame_util.perOrigSystem,
266: origSystemIdIn => tempApprover.orig_system_id,
267: nameOut => tempApprover.name,
268: displayNameOut => tempApprover.display_name);
269: else
271: tempApprover.orig_system := COAInsertee.orig_system;
272: tempApprover.orig_system_id := COAInsertee.orig_system_id;
273: tempApprover.display_name := COAInsertee.display_name;
274: firstApproverSource := COAInsertee.source;
275: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
276: firstAuthInsExists := true;
277: end if;
278: /* Get the threshholdJobLevel to convert parameters to absolute values */
279: ame_absolute_job_level_handler.getJobLevelAndSupervisor(
286: if parameterNumbers.count = 0 then
287: raise oneChainException;
288: end if;
289: for i in 1 .. parameterNumbers.count loop
290: ruleSatisfiedYN(i) := ame_util.booleanFalse;
291: end loop;
292: tempApprover.group_or_chain_id := chainCounter;
293: if (chainOrderMode = ame_util.serialChainsMode) then
294: tempApprover.group_or_chain_order_number := chainCounter;
289: for i in 1 .. parameterNumbers.count loop
290: ruleSatisfiedYN(i) := ame_util.booleanFalse;
291: end loop;
292: tempApprover.group_or_chain_id := chainCounter;
293: if (chainOrderMode = ame_util.serialChainsMode) then
294: tempApprover.group_or_chain_order_number := chainCounter;
295: else /* chain Order Mode is parallel */
296: tempApprover.group_or_chain_order_number := 1;
297: end if;
312: tempApprover.source := firstApproverSource;
313: firstApproverSource := null;
314: end if;
315: if(not finalAuthorityFound and
316: tempHasFinalAuthorityYN = ame_util.booleanTrue) then
317: finalAuthorityFound := true;
318: finalAuthorityApproverCategory := tempApprover.approver_category;
319: finalAuthoritySource := tempApprover.source;
320: end if;
329: actionTypeIdIn => tempApprover.action_type_id,
330: groupOrChainIdIn => tempApprover.group_or_chain_id);
331:
332: tempMemberOrderNumber := tempMemberOrderNumber + 1;
333: if(votingRegimeType = ame_util.serializedVoting) then
334: tempApprover.member_order_number := tempMemberOrderNumber;
335: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
336: tempApprover.member_order_number := 1;
337: end if;
331:
332: tempMemberOrderNumber := tempMemberOrderNumber + 1;
333: if(votingRegimeType = ame_util.serializedVoting) then
334: tempApprover.member_order_number := tempMemberOrderNumber;
335: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
336: tempApprover.member_order_number := 1;
337: end if;
338: tempApprover.approval_status := ame_engine.getHandlerApprovalStatus(approverIn => tempApprover);
339: /* The engine will set tempApprover.approver_order_number; leave it null here. */
342: insertion is found, keep checking till no more COA insertions. The check
343: for final authority will need to be done again. */
344: loop
345: /* Initialize COAInsertee approverRecord2 */
346: COAInsertee := ame_util.emptyApproverRecord2;
347: /* Check if there are any COAInsertions */
348: ame_engine.getHandlerCOAInsertion(nameIn => tempApprover.name,
349: itemClassIn => tempApprover.item_class,
350: itemIdIn => tempApprover.item_id,
376: hasFinalAuthorityYNOut => tempHasFinalAuthorityYN,
377: supervisorJobLevelOut => tempSupervisorJobLevel,
378: nextSupervisorIdOut => tempNextSupervisorId);
379: tempApprover.source := COAInsertee.source;
380: tempApprover.approver_category := ame_util.approvalApproverCategory;
381: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
382: tempMemberOrderNumber := tempMemberOrderNumber + 1;
383: if(votingRegimeType = ame_util.serializedVoting) then
384: tempApprover.member_order_number := tempMemberOrderNumber;
377: supervisorJobLevelOut => tempSupervisorJobLevel,
378: nextSupervisorIdOut => tempNextSupervisorId);
379: tempApprover.source := COAInsertee.source;
380: tempApprover.approver_category := ame_util.approvalApproverCategory;
381: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
382: tempMemberOrderNumber := tempMemberOrderNumber + 1;
383: if(votingRegimeType = ame_util.serializedVoting) then
384: tempApprover.member_order_number := tempMemberOrderNumber;
385: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
379: tempApprover.source := COAInsertee.source;
380: tempApprover.approver_category := ame_util.approvalApproverCategory;
381: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
382: tempMemberOrderNumber := tempMemberOrderNumber + 1;
383: if(votingRegimeType = ame_util.serializedVoting) then
384: tempApprover.member_order_number := tempMemberOrderNumber;
385: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
386: tempApprover.member_order_number := 1;
387: end if;
381: tempApprover.api_insertion := ame_util.apiAuthorityInsertion;
382: tempMemberOrderNumber := tempMemberOrderNumber + 1;
383: if(votingRegimeType = ame_util.serializedVoting) then
384: tempApprover.member_order_number := tempMemberOrderNumber;
385: else /* votingRegimeType in (ame_util.consensusVoting, ame_util.firstApproverVoting) */
386: tempApprover.member_order_number := 1;
387: end if;
388: tempApprover.occurrence := ame_engine.getHandlerOccurrence(nameIn => tempApprover.name,
389: itemClassIn => tempApprover.item_class,
390: itemIdIn => tempApprover.item_id,
391: actionTypeIdIn => tempApprover.action_type_id,
392: groupOrChainIdIn => tempApprover.group_or_chain_id);
393: tempApprover.approval_status := ame_engine.getHandlerApprovalStatus(approverIn => tempApprover);
394: /* If approver has a status of ame_util.approve or ame_util.approveAndForwardStatus or
395: ame_util.nullStatus check to see if approver could have final authority */
396: if ((tempApprover.approval_status is null) or
397: (tempApprover.approval_status in
398: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
391: actionTypeIdIn => tempApprover.action_type_id,
392: groupOrChainIdIn => tempApprover.group_or_chain_id);
393: tempApprover.approval_status := ame_engine.getHandlerApprovalStatus(approverIn => tempApprover);
394: /* If approver has a status of ame_util.approve or ame_util.approveAndForwardStatus or
395: ame_util.nullStatus check to see if approver could have final authority */
396: if ((tempApprover.approval_status is null) or
397: (tempApprover.approval_status in
398: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
399: ame_util.repeatedStatus, ame_util.suppressedStatus,
394: /* If approver has a status of ame_util.approve or ame_util.approveAndForwardStatus or
395: ame_util.nullStatus check to see if approver could have final authority */
396: if ((tempApprover.approval_status is null) or
397: (tempApprover.approval_status in
398: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
399: ame_util.repeatedStatus, ame_util.suppressedStatus,
400: ame_util.beatByFirstResponderStatus, ame_util.nullStatus)) or
401: (tempApprover.approver_category = ame_util.approvalApproverCategory and
402: tempApprover.approval_status = ame_util.notifiedStatus) )
395: ame_util.nullStatus check to see if approver could have final authority */
396: if ((tempApprover.approval_status is null) or
397: (tempApprover.approval_status in
398: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
399: ame_util.repeatedStatus, ame_util.suppressedStatus,
400: ame_util.beatByFirstResponderStatus, ame_util.nullStatus)) or
401: (tempApprover.approver_category = ame_util.approvalApproverCategory and
402: tempApprover.approval_status = ame_util.notifiedStatus) )
403: then
396: if ((tempApprover.approval_status is null) or
397: (tempApprover.approval_status in
398: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
399: ame_util.repeatedStatus, ame_util.suppressedStatus,
400: ame_util.beatByFirstResponderStatus, ame_util.nullStatus)) or
401: (tempApprover.approver_category = ame_util.approvalApproverCategory and
402: tempApprover.approval_status = ame_util.notifiedStatus) )
403: then
404: if(not finalAuthorityFound and
397: (tempApprover.approval_status in
398: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
399: ame_util.repeatedStatus, ame_util.suppressedStatus,
400: ame_util.beatByFirstResponderStatus, ame_util.nullStatus)) or
401: (tempApprover.approver_category = ame_util.approvalApproverCategory and
402: tempApprover.approval_status = ame_util.notifiedStatus) )
403: then
404: if(not finalAuthorityFound and
405: tempHasFinalAuthorityYN = ame_util.booleanTrue) then
398: (ame_util.approvedStatus, ame_util.approveAndForwardStatus,
399: ame_util.repeatedStatus, ame_util.suppressedStatus,
400: ame_util.beatByFirstResponderStatus, ame_util.nullStatus)) or
401: (tempApprover.approver_category = ame_util.approvalApproverCategory and
402: tempApprover.approval_status = ame_util.notifiedStatus) )
403: then
404: if(not finalAuthorityFound and
405: tempHasFinalAuthorityYN = ame_util.booleanTrue) then
406: finalAuthorityFound := true;
401: (tempApprover.approver_category = ame_util.approvalApproverCategory and
402: tempApprover.approval_status = ame_util.notifiedStatus) )
403: then
404: if(not finalAuthorityFound and
405: tempHasFinalAuthorityYN = ame_util.booleanTrue) then
406: finalAuthorityFound := true;
407: end if;
408: end if;
409: ame_engine.addApprover(approverIn => tempApprover);
438: if(finalAuthorityFound and
439: tempOldJobLevel <> tempJobLevel) then
440: exit;
441: end if;
442: tempApprover.api_insertion := ame_util.oamGenerated;
443: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
444: origSystemIn => ame_util.perOrigSystem,
445: origSystemIdIn => tempApprover.orig_system_id,
446: nameOut => tempApprover.name,
440: exit;
441: end if;
442: tempApprover.api_insertion := ame_util.oamGenerated;
443: ame_approver_type_pkg.getWfRolesNameAndDisplayName(
444: origSystemIn => ame_util.perOrigSystem,
445: origSystemIdIn => tempApprover.orig_system_id,
446: nameOut => tempApprover.name,
447: displayNameOut => tempApprover.display_name);
448: if firstAuthInsExists then
455: end loop;
456: exception
457: when oneChainException then
458: errorCode := -20001;
459: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
460: messageNameIn => 'AME_400253_HAN_ONE_CHN_REQ');
461: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
462: routineNameIn => 'handler',
463: exceptionNumberIn => errorCode,
457: when oneChainException then
458: errorCode := -20001;
459: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
460: messageNameIn => 'AME_400253_HAN_ONE_CHN_REQ');
461: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
462: routineNameIn => 'handler',
463: exceptionNumberIn => errorCode,
464: exceptionStringIn => errorMessage);
465: raise_application_error(errorCode,
466: errorMessage);
467: when noSupervisorException then
468: if tempApprover.display_name is null then
469: personDisplayName := ame_approver_type_pkg.getApproverDisplayName2(
470: origSystemIn => ame_util.perOrigSystem,
471: origSystemIdIn => tempApprover.orig_system_id );
472: else
473: personDisplayName := tempApprover.display_name;
474: end if;
472: else
473: personDisplayName := tempApprover.display_name;
474: end if;
475: errorCode := -20001;
476: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
477: messageNameIn => 'AME_400297_HAN_LACK_SPVR',
478: tokenNameOneIn => 'FIRST_NAME',
479: tokenValueOneIn => personDisplayName,
480: tokenNameTwoIn => 'LAST_NAME',
480: tokenNameTwoIn => 'LAST_NAME',
481: tokenValueTwoIn => null ,
482: tokenNameThreeIn => 'OTHER_NAME',
483: tokenValueThreeIn => null );
484: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
485: routineNameIn => 'handler',
486: exceptionNumberIn => errorCode,
487: exceptionStringIn => errorMessage);
488: raise_application_error(errorCode,
489: errorMessage);
490: when nullFirstIdException then
491: errorCode := -20001;
492: errorMessage :=
493: ame_util.getMessage(applicationShortNameIn => 'PER',
494: messageNameIn => 'AME_400250_HAN_NULL_FRST_STRT',
495: tokenNameOneIn => 'STARTING_POINT_ATTRIBUTE',
496: tokenValueOneIn => ame_util.firstStartingPointAttribute);
497: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
492: errorMessage :=
493: ame_util.getMessage(applicationShortNameIn => 'PER',
494: messageNameIn => 'AME_400250_HAN_NULL_FRST_STRT',
495: tokenNameOneIn => 'STARTING_POINT_ATTRIBUTE',
496: tokenValueOneIn => ame_util.firstStartingPointAttribute);
497: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
498: routineNameIn => 'handler',
499: exceptionNumberIn => errorCode,
500: exceptionStringIn => errorMessage);
493: ame_util.getMessage(applicationShortNameIn => 'PER',
494: messageNameIn => 'AME_400250_HAN_NULL_FRST_STRT',
495: tokenNameOneIn => 'STARTING_POINT_ATTRIBUTE',
496: tokenValueOneIn => ame_util.firstStartingPointAttribute);
497: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
498: routineNameIn => 'handler',
499: exceptionNumberIn => errorCode,
500: exceptionStringIn => errorMessage);
501: raise_application_error(errorCode,
502: errorMessage);
503: when nullSecondIdException then
504: errorCode := -20001;
505: errorMessage :=
506: ame_util.getMessage(applicationShortNameIn => 'PER',
507: messageNameIn => 'AME_400250_HAN_NULL_FRST_STRT',
508: tokenNameOneIn => 'STARTING_POINT_ATTRIBUTE',
509: tokenValueOneIn => ame_util.secondStartingPointAttribute);
510: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
505: errorMessage :=
506: ame_util.getMessage(applicationShortNameIn => 'PER',
507: messageNameIn => 'AME_400250_HAN_NULL_FRST_STRT',
508: tokenNameOneIn => 'STARTING_POINT_ATTRIBUTE',
509: tokenValueOneIn => ame_util.secondStartingPointAttribute);
510: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
511: routineNameIn => 'handler',
512: exceptionNumberIn => errorCode,
513: exceptionStringIn => errorMessage);
506: ame_util.getMessage(applicationShortNameIn => 'PER',
507: messageNameIn => 'AME_400250_HAN_NULL_FRST_STRT',
508: tokenNameOneIn => 'STARTING_POINT_ATTRIBUTE',
509: tokenValueOneIn => ame_util.secondStartingPointAttribute);
510: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
511: routineNameIn => 'handler',
512: exceptionNumberIn => errorCode,
513: exceptionStringIn => errorMessage);
514: raise_application_error(errorCode,
513: exceptionStringIn => errorMessage);
514: raise_application_error(errorCode,
515: errorMessage);
516: when others then
517: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
518: routineNameIn => 'handler',
519: exceptionNumberIn => sqlcode,
520: exceptionStringIn => sqlerrm);
521: raise;
522: end handler;
523: procedure parseAndSortRules(chainNumIn in integer) as
524: badParameterException exception;
525: errorCode integer;
526: errorMessage ame_util.longestStringType;
527: tempCategory ame_util.charType;
528: tempIndex integer;
529: tempLength integer;
530: tempNumber integer;
523: procedure parseAndSortRules(chainNumIn in integer) as
524: badParameterException exception;
525: errorCode integer;
526: errorMessage ame_util.longestStringType;
527: tempCategory ame_util.charType;
528: tempIndex integer;
529: tempLength integer;
530: tempNumber integer;
531: tempRuleId integer;
528: tempIndex integer;
529: tempLength integer;
530: tempNumber integer;
531: tempRuleId integer;
532: tempSign ame_util.charType;
533: upperLimit integer;
534: begin
535: /* Parse. */
536: tempIndex := 0;
601: end loop;
602: exception
603: when badParameterException then
604: errorCode := -20001;
605: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
606: messageNameIn => 'AME_400234_HAN_ACT_PAR_SIGN');
607: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
608: routineNameIn => 'parseAndSortRules',
609: exceptionNumberIn => errorCode,
603: when badParameterException then
604: errorCode := -20001;
605: errorMessage := ame_util.getMessage(applicationShortNameIn => 'PER',
606: messageNameIn => 'AME_400234_HAN_ACT_PAR_SIGN');
607: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
608: routineNameIn => 'parseAndSortRules',
609: exceptionNumberIn => errorCode,
610: exceptionStringIn => errorMessage);
611: raise_application_error(errorCode,
610: exceptionStringIn => errorMessage);
611: raise_application_error(errorCode,
612: errorMessage);
613: when others then
614: ame_util.runtimeException(packageNameIn => 'ame_dual_chains_handler',
615: routineNameIn => 'parseAndSortRules',
616: exceptionNumberIn => sqlcode,
617: exceptionStringIn => sqlerrm);
618: raise;