/// <summary> /// Closes the assignment. /// </summary> /// <param name="context">The context.</param> protected virtual void CloseAssignment(BusinessContext context) { CloseAssignmentRequest request = (CloseAssignmentRequest)context.Request; // Load Assignment MetaObject metaObject = MetaObjectActivator.CreateInstance(AssignmentEntity.ClassName, context.GetTargetPrimaryKeyId().Value); if (((int)metaObject[AssignmentEntity.FieldState]) != (int)AssignmentState.Active) { throw new InvalidOperationException(); } DateTime dateTimeNow = DataContext.Current.CurrentUserTimeZone.ToLocalTime(DateTime.UtcNow); // Update Meta Object Fields metaObject[AssignmentEntity.FieldClosedBy] = (int)DataContext.Current.CurrentUserId; metaObject[AssignmentEntity.FieldState] = (int)AssignmentState.Closed; metaObject[AssignmentEntity.FieldExecutionResult] = request.ExecutionResult; metaObject[AssignmentEntity.FieldComment] = request.Comment; metaObject[AssignmentEntity.FieldActualFinishDate] = dateTimeNow; // Save Meta Object metaObject.Save(); if (metaObject[AssignmentEntity.FieldWorkflowInstanceId] != null) { // Run Workflow AssignmentEntity entity = (AssignmentEntity)BusinessManager.Load(AssignmentEntity.ClassName, context.GetTargetPrimaryKeyId().Value); RunWorkflow(entity); } context.SetResponse(new Response()); }
/// <summary> /// Processes this instance. /// </summary> public static void Process() { // Step 1. Process WorkflowInstanceEntity // Step 1-1. Set Overdue foreach (WorkflowInstanceEntity entity in BusinessManager.List(WorkflowInstanceEntity.ClassName, new FilterElement[] { FilterElement.EqualElement(WorkflowInstanceEntity.FieldState, (int)BusinessProcessState.Active), FilterElement.IsNullElement(WorkflowInstanceEntity.FieldTimeStatus), new FilterElement(WorkflowInstanceEntity.FieldPlanFinishDate, FilterElementType.LessOrEqual, DateTime.UtcNow) })) { BusinessManager.Update(entity); } // Step 1-2. Reset Overdue foreach (WorkflowInstanceEntity entity in BusinessManager.List(WorkflowInstanceEntity.ClassName, new FilterElement[] { FilterElement.EqualElement(WorkflowInstanceEntity.FieldState, (int)BusinessProcessState.Active), FilterElement.EqualElement(WorkflowInstanceEntity.FieldTimeStatus, (int)WorkflowInstanceTimeStatus.OverDue), new FilterElement(WorkflowInstanceEntity.FieldPlanFinishDate, FilterElementType.Greater, DateTime.UtcNow) })) { BusinessManager.Update(entity); } // Step 2. Process AssignmentEntity // Step 2-1. Set Overdue foreach (AssignmentEntity entity in BusinessManager.List(AssignmentEntity.ClassName, new FilterElement[] { FilterElement.EqualElement(AssignmentEntity.FieldState, (int)AssignmentState.Active), FilterElement.IsNullElement(AssignmentEntity.FieldTimeStatus), new FilterElement(AssignmentEntity.FieldPlanFinishDate, FilterElementType.LessOrEqual, DateTime.UtcNow) })) { // Process Auto Complete if (entity.WorkflowInstanceId.HasValue) { WorkflowInstanceEntity wfInstance = (WorkflowInstanceEntity)BusinessManager.Load(WorkflowInstanceEntity.ClassName, entity.WorkflowInstanceId.Value); switch (WorkflowParameters.GetAssignmentOverdueAction(wfInstance)) { case AssignmentOverdueAction.NoAction: BusinessManager.Update(entity); break; case AssignmentOverdueAction.AutoCompleteWithDecline: CloseAssignmentRequest declineRequet = new CloseAssignmentRequest(entity.PrimaryKeyId.Value, (int)AssignmentExecutionResult.Declined); declineRequet.Comment = WorkflowParameters.GetAutoCompleteComment(wfInstance); if(string.IsNullOrEmpty(declineRequet.Comment)) declineRequet.Comment = GetAutoCompleteDefaultComment(); BusinessManager.Execute(declineRequet); break; case AssignmentOverdueAction.AutoCompleteWithAccept: CloseAssignmentRequest acceptRequet = new CloseAssignmentRequest(entity.PrimaryKeyId.Value, (int)AssignmentExecutionResult.Accepted); acceptRequet.Comment = WorkflowParameters.GetAutoCompleteComment(wfInstance); if (string.IsNullOrEmpty(acceptRequet.Comment)) acceptRequet.Comment = GetAutoCompleteDefaultComment(); BusinessManager.Execute(acceptRequet); break; } } else { BusinessManager.Update(entity); } } // Step 2-1. Reset Overdue foreach (AssignmentEntity entity in BusinessManager.List(AssignmentEntity.ClassName, new FilterElement[] { FilterElement.EqualElement(AssignmentEntity.FieldState, (int)AssignmentState.Active), FilterElement.EqualElement(AssignmentEntity.FieldTimeStatus, (int)AssignmentTimeStatus.OverDue), new FilterElement(AssignmentEntity.FieldPlanFinishDate, FilterElementType.Greater, DateTime.UtcNow) })) { BusinessManager.Update(entity); } }