Exemple #1
0
        private void ProcessCollection(DataTable dt, ActivityInfoCollection activities, int level)
        {
            level++;

            foreach (Mediachase.Ibn.Assignments.ActivityInfo activityInfo in activities)
            {
                DataRow row = dt.NewRow();

                if (activityInfo.Type == ActivityType.Block)
                {
                    row["Subject"] = GetGlobalResourceObject("IbnFramework.BusinessProcess", "ParallelBlock").ToString();
                }
                else
                {
                    row["Subject"] = (activityInfo.Subject != null) ? activityInfo.Subject : String.Empty;
                }

                if (activityInfo.UserId.HasValue)
                {
                    row["User"] = CommonHelper.GetUserStatus(activityInfo.UserId.Value);
                }
                row["State"] = (int)activityInfo.State;

                if (activityInfo.ExecutionResult.HasValue)
                {
                    row["Result"] = activityInfo.ExecutionResult.Value;
                }
                if (activityInfo.ActualFinishDate.HasValue)
                {
                    row["FinishDate"] = String.Concat(activityInfo.ActualFinishDate.Value.ToShortDateString(), " ", activityInfo.ActualFinishDate.Value.ToShortTimeString());
                }
                row["Comment"] = CHelper.ParseText(activityInfo.Comment, true, true, true);
                row["Indent"]  = (level - 1) * indentSize;
                if (activityInfo.ClosedBy.HasValue)
                {
                    row["ClosedBy"] = CommonHelper.GetUserStatus(activityInfo.ClosedBy.Value);
                }
                if (activityInfo.PlanFinishDate.HasValue)
                {
                    row["PlanFinishDate"] = String.Concat(activityInfo.PlanFinishDate.Value.ToShortDateString(), " ", activityInfo.PlanFinishDate.Value.ToShortTimeString());
                }

                row["ReadOnly"] = false;
                PropertyValueCollection properties = activityInfo.AssignmentProperties;
                if (properties.Contains(AssignmentCustomProperty.ReadOnlyLibraryAccess))
                {
                    bool?readOnly = properties[AssignmentCustomProperty.ReadOnlyLibraryAccess] as bool?;
                    if (readOnly.HasValue)
                    {
                        row["ReadOnly"] = readOnly.Value;
                    }
                }

                dt.Rows.Add(row);

                ProcessCollection(dt, activityInfo.Activities, level);
            }
        }
        private static void FillPlanFinishDate(ActivityInfoCollection activities)
        {
            double avgDurations = double.MinValue;
            DateTime dateTimeNow = DataContext.Current.CurrentUserTimeZone.ToLocalTime(DateTime.UtcNow);

            for(int index = 0; index<activities.Count; index++)
            {
                ActivityInfo activity = activities[index];

                if (activity.State == AssignmentState.Pending && activity.PlanFinishDate == null)
                {
                    if (activity.Parent != null)
                    {
                        activity.PlanStartDate = activity.Parent.PlanStartDate;
                        activity.PlanFinishDate = activity.Parent.PlanFinishDate;
                    }
                    else
                    {
                        activity.PlanStartDate = activities[index - 1].PlanFinishDate;

                        int elementWidth = activity.Type== ActivityType.Assignment?
                            (activity.Activities.Count == 0 ? 1 : activity.Activities.Count) : (activity.Activities.Count);

                        if (avgDurations == double.MinValue)
                        {
                            if (elementWidth == 0)
                            {
                                avgDurations = 0;
                            }
                            else
                            {
                                int belowCount = activity.GetActivitiesBelowCount();
                                avgDurations = (activity.BusinessProcess.PlanFinishDate.Value - activity.PlanStartDate.Value).TotalMinutes / (belowCount + elementWidth);
                            }
                        }

                        activity.PlanFinishDate = activity.PlanStartDate.Value.AddMinutes(elementWidth*avgDurations);
                    }

                    if (activity.PlanStartDate.HasValue &&
                        activity.PlanStartDate.Value < dateTimeNow)
                        activity.TimeStatus = AssignmentTimeStatus.OverStart;

                    if (activity.PlanFinishDate.HasValue &&
                        activity.PlanFinishDate.Value < dateTimeNow)
                        activity.TimeStatus = AssignmentTimeStatus.OverDue;
                }

                if (activity.Activities.Count > 0)
                    FillPlanFinishDate(activity.Activities);
            }
        }
        /// <summary>
        /// Creates the business process activity info.
        /// </summary>
        /// <param name="businessProcess">The business process.</param>
        /// <param name="scope">The scope.</param>
        /// <param name="parentActivity">The parent activity.</param>
        /// <param name="activityInfoItems">The activity info items.</param>
        private static void CreateBusinessProcessActivityInfo(BusinessProcessInfo businessProcess, WorkflowChangesScope scope, EntityObject[] assignments, CompositeActivity parentActivity, ActivityInfoCollection activityInfoItems)
        {
            foreach (Activity activity in parentActivity.Activities)
            {
                if (activity is CreateAssignmentAndWaitResultActivity)
                {
                    CreateAssignmentAndWaitResultActivity asgActivity = (CreateAssignmentAndWaitResultActivity)activity;
                    PropertyValueCollection properties = asgActivity.AssignmentProperties;

                    ActivityInfo activityInfo = new ActivityInfo();
                    activityInfoItems.Add(activityInfo);

                    activityInfo.Name = activity.Name;
                    activityInfo.Type = ActivityType.Assignment;

                    AssignmentEntity assignment = FindAssignmentByActivityName(assignments, activity.Name);

                    if (assignment != null)
                    {
                        activityInfo.State = (AssignmentState)assignment.State;
                        activityInfo.Subject = assignment.Subject;

                        activityInfo.TimeStatus = (AssignmentTimeStatus?)assignment.TimeStatus;

                        activityInfo.PlanStartDate = assignment.ActualStartDate;
                        activityInfo.PlanFinishDate = assignment.PlanFinishDate;

                        activityInfo.ActualStartDate = assignment.ActualStartDate;
                        activityInfo.ActualFinishDate = assignment.ActualFinishDate;
                        activityInfo.Comment = assignment.Comment;

                        activityInfo.UserId = assignment.UserId;

                        activityInfo.ClosedBy = assignment.ClosedBy;

                        activityInfo.ExecutionResult = (AssignmentExecutionResult?)assignment.ExecutionResult;
                    }
                    else
                    {
                        activityInfo.State = businessProcess.State == BusinessProcessState.Closed?
                            AssignmentState.Closed:
                            AssignmentState.Pending;

                        if (asgActivity.AssignmentProperties.Contains(AssignmentEntity.FieldSubject))
                            activityInfo.Subject = (string)asgActivity.AssignmentProperties[AssignmentEntity.FieldSubject];

                        if (asgActivity.AssignmentProperties.Contains(AssignmentEntity.FieldUserId))
                            activityInfo.UserId = (int?)asgActivity.AssignmentProperties[AssignmentEntity.FieldUserId];

                        // Resolve Plan Time
                        //if (activityInfo.State == AssignmentState.Pending &&
                        //    businessProcess.State == BusinessProcessState.Active &&
                        //    businessProcess.PlanFinishDate.HasValue)
                        //{
                        //    //CalculatePlanFinishDate(businessProcess, parentActivity, activity, activityInfo);
                        //}

                        //if (activityInfo.PlanStartDate.HasValue &&
                        //    activityInfo.PlanStartDate.Value < DateTime.Now)
                        //    activityInfo.TimeStatus = AssignmentTimeStatus.OverStart;

                        //if (activityInfo.PlanFinishDate.HasValue &&
                        //    activityInfo.PlanFinishDate.Value < DateTime.Now)
                        //    activityInfo.TimeStatus = AssignmentTimeStatus.OverDue;
                    }

                    // 2008-07-07 Added Assignment Properties
                    activityInfo.AssignmentProperties.AddRange(asgActivity.AssignmentProperties);
                    //
                }
                else if (activity is BlockActivity)
                {
                    // Create Block Info
                    ActivityInfo blockInfo = new ActivityInfo();
                    activityInfoItems.Add(blockInfo);

                    blockInfo.Name = activity.Name;
                    blockInfo.Type = ActivityType.Block;

                    blockInfo.State = businessProcess.State == BusinessProcessState.Closed ?
                            AssignmentState.Closed :
                            AssignmentState.Pending;

                    CreateBusinessProcessActivityInfo(businessProcess, scope, assignments, (BlockActivity)activity, blockInfo.Activities);

                    if (blockInfo.State == AssignmentState.Pending)
                    {
                        if (blockInfo.Activities.Count > 0)
                        {
                            foreach (ActivityInfo childActivitiInfo in blockInfo.Activities)
                            {
                                if (childActivitiInfo.State == AssignmentState.Active)
                                {
                                    blockInfo.State = AssignmentState.Active;
                                    break;
                                }
                                else if (childActivitiInfo.State == AssignmentState.Closed)
                                {
                                    blockInfo.State = AssignmentState.Closed;
                                }
                            }
                        }
                        else
                        {
                            int blockIndex = activityInfoItems.IndexOf(blockInfo);

                            if(blockIndex==0)
                                blockInfo.State = AssignmentState.Closed;
                            else
                                blockInfo.State = activityInfoItems[blockIndex-1].State==AssignmentState.Active? AssignmentState.Pending:
                                    activityInfoItems[blockIndex - 1].State;
                        }
                    }

                    if (blockInfo.Activities.Count > 0 &&
                        (blockInfo.State == AssignmentState.Active ||
                        blockInfo.State == AssignmentState.Closed))
                    {
                        blockInfo.PlanStartDate = blockInfo.Activities[0].PlanStartDate;
                        blockInfo.PlanFinishDate = blockInfo.Activities[0].PlanFinishDate;
                    }
                }
            }
        }
        private void ProcessCollection(DataTable dt, ActivityInfoCollection activities, int level)
        {
            level++;

            foreach (Mediachase.Ibn.Assignments.ActivityInfo activityInfo in activities)
            {
                DataRow row = dt.NewRow();

                if (activityInfo.Type == ActivityType.Block)
                    row["Subject"] = GetGlobalResourceObject("IbnFramework.BusinessProcess", "ParallelBlock").ToString();
                else
                    row["Subject"] = (activityInfo.Subject != null) ? activityInfo.Subject : String.Empty;

                if (activityInfo.UserId.HasValue)
                    row["User"] = CommonHelper.GetUserStatus(activityInfo.UserId.Value);
                row["State"] = (int)activityInfo.State;

                if (activityInfo.ExecutionResult.HasValue)
                    row["Result"] = activityInfo.ExecutionResult.Value;
                if (activityInfo.ActualFinishDate.HasValue)
                    row["FinishDate"] = String.Concat(activityInfo.ActualFinishDate.Value.ToShortDateString(), " ", activityInfo.ActualFinishDate.Value.ToShortTimeString());
                row["Comment"] = CHelper.ParseText(activityInfo.Comment, true, true, true);
                row["Indent"] = (level - 1) * indentSize;
                if (activityInfo.ClosedBy.HasValue)
                {
                    row["ClosedBy"] = CommonHelper.GetUserStatus(activityInfo.ClosedBy.Value);
                }
                if (activityInfo.PlanFinishDate.HasValue)
                    row["PlanFinishDate"] = String.Concat(activityInfo.PlanFinishDate.Value.ToShortDateString(), " ", activityInfo.PlanFinishDate.Value.ToShortTimeString());

                row["ReadOnly"] = false;
                PropertyValueCollection properties = activityInfo.AssignmentProperties;
                if (properties.Contains(AssignmentCustomProperty.ReadOnlyLibraryAccess))
                {
                    bool? readOnly = properties[AssignmentCustomProperty.ReadOnlyLibraryAccess] as bool?;
                    if (readOnly.HasValue)
                        row["ReadOnly"] = readOnly.Value;
                }

                dt.Rows.Add(row);

                ProcessCollection(dt, activityInfo.Activities, level);
            }
        }