private bool RollupRuleCheck(Activity activity, RollupAction action) { // as per bullet #10 on SN-4-35, "Rollup rules have no effect if defined on a leaf activity - there is nothing // to rollup. if (activity.IsLeaf) { return false; } ReadOnlyCollection<SequencingRollupRuleNodeReader> rules; bool useDefault = true; foreach(SequencingRollupRuleNodeReader rule in activity.Sequencing.RollupRules) { //if(action == rule.Action) //{ // useDefault = false; // break; //} if(action == RollupAction.NotSatisfied || action == RollupAction.Satisfied) { if(rule.Action == RollupAction.NotSatisfied || rule.Action == RollupAction.Satisfied) { useDefault = false; break; } } else { if(rule.Action == RollupAction.Completed || rule.Action == RollupAction.Incomplete) { useDefault = false; break; } } } if(useDefault) { rules = GetDefaultRollupRules(); } else { rules = activity.Sequencing.RollupRules; } foreach(SequencingRollupRuleNodeReader rule in rules) { if(rule.Action == action) { List<bool?> contributingChildren = new List<bool?>(); foreach(Activity child in activity.Children) { if(child.Sequencing.Tracked) { // Make sure this child contributes to the status of its parent if(CheckChildForRollup(child, action)) { contributingChildren.Add(EvaluateRollupConditions(child, rule)); } } } // Determine if the appropriate children contributed to rollup; if they did, the status of the activity should be changed bool status = false; int count = 0; switch(rule.ChildActivitySet) { case RollupChildActivitySet.All: status = true; foreach(bool? b in contributingChildren) { if(b != true) { status = false; break; } } break; case RollupChildActivitySet.Any: foreach(bool? b in contributingChildren) { if(b == true) { status = true; break; } } break; case RollupChildActivitySet.None: status = true; foreach(bool? b in contributingChildren) { if(b == true || b == null) { status = false; break; } } break; case RollupChildActivitySet.AtLeastCount: foreach(bool? b in contributingChildren) { if(b == true) { ++count; } } if(count >= rule.MinimumCount) { status = true; } break; case RollupChildActivitySet.AtLeastPercent: foreach(bool? b in contributingChildren) { if(b == true) { ++count; } } double percent = 0; if(contributingChildren.Count > 0) { percent = (double)count / (double)contributingChildren.Count; } if(percent >= rule.MinimumPercent) { status = true; } break; } if(status) { return true; } } } return false; }
private bool CheckChildForRollup(Activity activity, RollupAction action) { bool included = false; if(action == RollupAction.Satisfied || action == RollupAction.NotSatisfied) { if(activity.Sequencing.RollupObjectiveSatisfied) // Test the objective rollup control { included = true; // Default Behavior - adlseq:requiredFor[xxx] == always if((action == RollupAction.Satisfied && activity.Sequencing.RequiredForSatisfied == RollupConsideration.IfNotSuspended) || (action == RollupAction.NotSatisfied && activity.Sequencing.RequiredForNotSatisfied == RollupConsideration.IfNotSuspended)) { if(activity.DataModel.ActivityAttemptCount > 0 && activity.DataModel.ActivityIsSuspended) { included = false; } } else { if((action == RollupAction.Satisfied && activity.Sequencing.RequiredForSatisfied == RollupConsideration.IfAttempted) || (action == RollupAction.NotSatisfied && activity.Sequencing.RequiredForNotSatisfied == RollupConsideration.IfAttempted)) { if(activity.DataModel.ActivityAttemptCount == 0) { included = false; } } else { if((action == RollupAction.Satisfied && activity.Sequencing.RequiredForSatisfied == RollupConsideration.IfNotSkipped) || (action == RollupAction.NotSatisfied && activity.Sequencing.RequiredForNotSatisfied == RollupConsideration.IfNotSkipped)) { if(SequencingRulesCheck(activity, activity.Sequencing.PreConditionRules, SequencingRuleAction.Skip)) { included = false; } } } } } } else if(action == RollupAction.Completed || action == RollupAction.Incomplete) { // Test the progress rollup control if(activity.Sequencing.RollupProgressCompletion) { included = true; // Default Behavior - adlseq:requiredFor[xxx] == always if((action == RollupAction.Completed && activity.Sequencing.RequiredForCompleted == RollupConsideration.IfNotSuspended) || (action == RollupAction.Incomplete && activity.Sequencing.RequiredForIncomplete == RollupConsideration.IfNotSuspended)) { if(activity.DataModel.ActivityAttemptCount > 0 && activity.DataModel.ActivityIsSuspended) { included = false; } } else { if((action == RollupAction.Completed && activity.Sequencing.RequiredForCompleted == RollupConsideration.IfAttempted) || (action == RollupAction.Incomplete && activity.Sequencing.RequiredForIncomplete == RollupConsideration.IfAttempted)) { if(activity.DataModel.ActivityAttemptCount == 0) { included = false; } } else { if((action == RollupAction.Completed && activity.Sequencing.RequiredForCompleted == RollupConsideration.IfNotSkipped) || (action == RollupAction.Incomplete && activity.Sequencing.RequiredForIncomplete == RollupConsideration.IfNotSkipped)) { if(SequencingRulesCheck(activity, activity.Sequencing.PreConditionRules, SequencingRuleAction.Skip)) { included = false; } } } } } } return included; }