/// <summary> /// Основная функция обновления статуса /// Она проверяет все что нужно /// </summary> public ITask UpdateStatus(int taskId, int statusId, Limits limits) { ITask task = _Get(taskId); TimezTask oldTask = new TimezTask(task); if (task.TaskStatusId != statusId) { ITasksStatus newStatus = Utility.Statuses.Get(task.BoardId, statusId); CheckStatusLimits(newStatus, task.PlanningTime); CheckTaskLimits(newStatus, task.ExecutorUserId, limits, task); // Для обычных статусов только обновляем поля у задачи Repository.Tasks.UpdateStatus(task.Id, newStatus); // Обновляем у этой сущности, что б не запрашивать из бд task.TaskStatusId = newStatus.Id; task.TaskStatusPosition = newStatus.Position; task.StatusChangeDateTime = DateTime.Now; task.TaskStatusName = newStatus.Name; OnUpdateStatus.Invoke(this, new UpdateEventArgs <ITask>(oldTask, task)); } return(task); }
/// <summary> /// Получени задачи из архива /// </summary> public ITask GetFromArchive(int id) { var archive = Repository.Tasks.GetFromArchiveById(id) as ITask; TimezTask task = new TimezTask(archive); return(task); }
/// <summary> /// Перманентное удаление задачи /// </summary> /// <returns></returns> public ITask Delete(int id) { Task task = _Get(_Context, id); TimezTask dummy = null; if (task != null) { dummy = new TimezTask(task); _Context.Tasks.DeleteOnSubmit(task); _Context.SubmitChanges(); } return(dummy); }
public ITask SetPlanningTime(int boardId, int newStatusId, int taskId, int time, Limits limits) { ITask task = _Get(taskId); TimezTask oldTask = new TimezTask(task); var status = Utility.Statuses.Get(boardId, newStatusId); // проверяем в новом статусе лимиты CheckTaskLimits(status, task.ExecutorUserId, limits, task); task.PlanningTime = time; Repository.SubmitChanges(); OnUpdatePlaningTime.Invoke(new UpdateEventArgs <ITask>(oldTask, task)); return(task); }
public IProject SetProject(int taskId, int projectId, int boardId) { IProject project = Utility.Projects.Get(boardId, projectId); ITask task = _Get(taskId); if (task.ProjectId != project.Id) { ITask oldTask = new TimezTask(task); task.ProjectId = project.Id; task.ProjectName = project.Name; Repository.SubmitChanges(); OnUpdateProject.Invoke(new UpdateEventArgs <ITask>(oldTask, task)); } return(project); }
public IUser SetExecutor(int taskId, int userId) { IUser executor = Utility.Users.Get(userId); ITask task = _Get(taskId); if (task.ExecutorUserId != executor.Id) { TimezTask oldTask = new TimezTask(task); task.ExecutorUserId = executor.Id; task.ExecutorEmail = executor.EMail; task.ExecutorNick = executor.Nick; Repository.SubmitChanges(); OnTaskAssigned.Invoke(new UpdateEventArgs <ITask>(oldTask, task)); } return(executor); }
public IBoardsColor SetColor(int taskId, int colorId, int boardId) { IBoardsColor color = Utility.Boards.GetColor(boardId, colorId); ITask task = _Get(taskId); if (task.ColorId != color.Id) { ITask oldTask = new TimezTask(task); task.ColorId = color.Id; task.ColorHEX = color.Color; task.ColorName = color.Name; task.ColorPosition = color.Position; Repository.SubmitChanges(); OnUpdateColor.Invoke(new UpdateEventArgs <ITask>(oldTask, task)); } return(color); }
/// <summary> /// Обновлеяе основные параметры задачи /// Кроме статуса! Так как там сложная логика /// Обновление задачи, если задача была в кеше, то обновление происходит асинхронно /// Если в кеше задачи не было, то обновление синхронное и после задача добавляется в кеш /// </summary> public ITask Update(int boardId, int taskId, string name, string description, int userId, int projectId, int colorId, int?planingTime, Limits limits) { if (name.IsNullOrEmpty()) { throw new ArgumentException("Name"); } // TODO: Не вызывать апдейт, если ничиго не поменялось // TODO: Добавить колонку с временем обновления для поддержки версионности ITask task = _Get(taskId); TimezTask oldTask = new TimezTask(task); IProject project = Utility.Projects.Get(boardId, projectId); IBoardsColor color = Utility.Boards.GetColor(project.BoardId, colorId); IUser executor = Utility.Users.Get(userId); ITasksStatus status = Utility.Statuses.Get(boardId, task.TaskStatusId); CheckTaskLimits(status, userId, limits, task); bool taskAssigned = task.ExecutorUserId != executor.Id; bool colorChanged = task.ColorId != color.Id; bool projectChanged = task.ProjectId != project.Id; bool planingTimeChanged = task.PlanningTime != planingTime; task.Name = name; task.Description = description; task.ExecutorUserId = executor.Id; task.ExecutorEmail = executor.EMail; task.ExecutorNick = executor.Nick; task.ProjectId = project.Id; task.ProjectName = project.Name; task.ColorId = color.Id; task.ColorHEX = color.Color; task.ColorName = color.Name; task.ColorPosition = color.Position; task.PlanningTime = planingTime; using (TransactionScope scope = new TransactionScope()) { Repository.SubmitChanges(); OnUpdate.Invoke(new UpdateEventArgs <ITask>(oldTask, task)); if (taskAssigned) { OnTaskAssigned.Invoke(new UpdateEventArgs <ITask>(oldTask, task)); } if (colorChanged) { OnUpdateColor.Invoke(new UpdateEventArgs <ITask>(oldTask, task)); } if (projectChanged) { OnUpdateProject.Invoke(new UpdateEventArgs <ITask>(oldTask, task)); } if (planingTimeChanged) { OnUpdatePlaningTime.Invoke(new UpdateEventArgs <ITask>(oldTask, task)); } scope.Complete(); } return(task); }