Пример #1
0
        public void DeleteTask(int taskId, string currentUserName)
        {
            TaskBLL task = mapper.Map <_Task, TaskBLL>(db.Tasks.Get(taskId));

            if (task == null)
            {
                throw new ArgumentException("Task with this id not found", "taskId");
            }

            if (task.Author.Name == currentUserName)
            {
                if (!task.ParentId.HasValue)
                {
                    IEnumerable <TaskBLL> subtasksForDelete = subtaskService.GetSubtasksOfTask(task.Id);
                    foreach (var subtask in subtasksForDelete)
                    {
                        db.Tasks.Delete(subtask.Id);
                    }
                }
                else
                {
                    //then need to calculate new progress for parent task
                    _Task parrentTask = db.Tasks.Get(task.ParentId.Value);
                    parrentTask.Progress = subtaskService.CalculateProgressOfSubtask(task.ParentId.Value, task.Id, deleting: true);
                    db.Tasks.Update(parrentTask);
                }
                db.Tasks.Delete(task.Id);
                db.Save();
            }
            else
            {
                throw new InvalidOperationException("Access error. You cannot delete this task");
            }
        }
Пример #2
0
        public void SetNewStatus(int taskId, string statusName)
        {
            if (string.IsNullOrWhiteSpace(statusName))
            {
                throw new ArgumentNullException("Name of status is null or empty", "statusName");
            }
            Status status = db.Statuses.Find(s => (s.Name == statusName)).SingleOrDefault();

            _Task task = db.Tasks.Get(taskId);

            if (task == null)
            {
                throw new ArgumentException("Task wasn't found", "id");
            }
            task.Status = status ?? throw new ArgumentException("Status with this name wasn't found", "statusName");
            switch (statusName)
            {
            case "New":
            {
                task.DateStart = null;
                task.Progress  = 0;
                break;
            }

            case "In progress":
            {
                task.DateStart = DateTime.Now;
                task.Progress  = 0;
                if (!task.ParentId.HasValue)
                {
                    task.Progress = subtaskService.CalculateProgressOfSubtask(task.Id, 0);
                }
                break;
            }

            case "Done":
            {
                task.Progress = 100;
                if (!task.ParentId.HasValue)
                {
                    IEnumerable <_Task> subtasks = db.Tasks.Find(t => t.ParentId == task.Id);
                    foreach (var subtask in subtasks)
                    {
                        subtask.StatusId = status.Id;
                        subtask.Progress = 100;
                        db.Tasks.Update(subtask);
                    }
                }
                break;
            }

            case "Closed":
            {
                task.Progress = 100;
                break;
            }

            default:
                break;
            }

            if (task.ParentId.HasValue)
            {
                int   progress = subtaskService.CalculateProgressOfSubtask(task.ParentId.Value, task.Id, task.Progress);
                _Task mainTask = db.Tasks.Get(task.ParentId.Value);
                if (mainTask.Status.Name == "New")
                {
                    var underwayStatusList = new string[3] {
                        "Done", "In progress", "Closed"
                    };
                    if (underwayStatusList.Contains(task.Status.Name))
                    {
                        mainTask.StatusId = db.Statuses.Find(s => (s.Name == "In progress")).Single().Id;
                    }
                }
                mainTask.Progress = progress;
                db.Tasks.Update(mainTask);
            }

            db.Tasks.Update(task);
            db.Save();
        }