Esempio n. 1
0
        /// <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());
        }
Esempio n. 2
0
        /// <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);
            }
        }