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; } } } }
/// <summary> /// Initializes a new instance of the <see cref="BusinessProcessInfo"/> class. /// </summary> public BusinessProcessInfo() { this.Activities = new ActivityInfoCollection(this); }