Exemple #1
0
            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;
            }
Exemple #2
0
            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;
            }