public Task SaveOrUpdate(Task task, IEnumerable <int> attachedFileIds, bool notifyResponsible, bool isImport = false) { if (task == null) { throw new ArgumentNullException("task"); } if (task.Project == null) { throw new Exception("task.Project"); } // check guests responsibles foreach (var responsible in task.Responsibles) { if (ProjectSecurity.IsVisitor(responsible)) { ProjectSecurity.CreateGuestSecurityException(); } if (!ProjectSecurity.IsInTeam(task.Project, responsible)) { ProjectSecurity.CreateSecurityException(); } } var milestone = task.Milestone != 0 ? DaoFactory.MilestoneDao.GetById(task.Milestone) : null; var milestoneResponsible = milestone != null ? milestone.Responsible : Guid.Empty; var removeResponsibles = new List <Guid>(); var inviteToResponsibles = new List <Guid>(); task.Responsibles.RemoveAll(r => r.Equals(Guid.Empty)); if (task.Deadline.Kind != DateTimeKind.Local && task.Deadline != DateTime.MinValue) { task.Deadline = TenantUtil.DateTimeFromUtc(task.Deadline); } if (task.StartDate.Kind != DateTimeKind.Local && task.StartDate != DateTime.MinValue) { task.StartDate = TenantUtil.DateTimeFromUtc(task.StartDate); } var isNew = task.ID == default(int); //Task is new if (isNew) { if (task.CreateBy == default(Guid)) { task.CreateBy = SecurityContext.CurrentAccount.ID; } if (task.CreateOn == default(DateTime)) { task.CreateOn = TenantUtil.DateTimeNow(); } ProjectSecurity.DemandCreate <Task>(task.Project); task = DaoFactory.TaskDao.Create(task); inviteToResponsibles.AddRange(task.Responsibles.Distinct()); } else { var oldTask = DaoFactory.TaskDao.GetById(new [] { task.ID }).FirstOrDefault(); if (oldTask == null) { throw new ArgumentNullException("task"); } ProjectSecurity.DemandEdit(oldTask); var newResponsibles = task.Responsibles.Distinct().ToList(); var oldResponsibles = oldTask.Responsibles.Distinct().ToList(); removeResponsibles.AddRange(oldResponsibles.Where(p => !newResponsibles.Contains(p))); inviteToResponsibles.AddRange(newResponsibles.Where(participant => !oldResponsibles.Contains(participant))); task.LastModifiedBy = SecurityContext.CurrentAccount.ID; task.LastModifiedOn = TenantUtil.DateTimeNow(); task = DaoFactory.TaskDao.Update(task); } if (attachedFileIds != null && attachedFileIds.Any()) { foreach (var attachedFileId in attachedFileIds) { AttachFile(task, attachedFileId); } } var senders = new HashSet <Guid>(task.Responsibles) { task.Project.Responsible, milestoneResponsible, task.CreateBy }; senders.Remove(Guid.Empty); foreach (var subscriber in senders) { Subscribe(task, subscriber); } inviteToResponsibles.RemoveAll(r => r.Equals(Guid.Empty)); removeResponsibles.RemoveAll(r => r.Equals(Guid.Empty)); NotifyTask(task, inviteToResponsibles, removeResponsibles, isNew, notifyResponsible); return(task); }
public Task ChangeStatus(Task task, CustomTaskStatus newStatus) { ProjectSecurity.DemandEdit(task); if (task == null) { throw new ArgumentNullException("task"); } if (task.Project == null) { throw new Exception("Project can't be null."); } if (task.Project.Status == ProjectStatus.Closed) { throw new Exception(EngineResource.ProjectClosedError); } if (task.Status == newStatus.StatusType && task.CustomTaskStatus == newStatus.Id) { return(task); } var status = StatusEngine.Get().FirstOrDefault(r => r.Id == newStatus.Id); var cannotChange = status != null && status.Available.HasValue && !status.Available.Value && task.CreateBy != SecurityContext.CurrentAccount.ID && task.Project.Responsible != SecurityContext.CurrentAccount.ID && !ProjectSecurity.CurrentUserAdministrator; if (cannotChange) { ProjectSecurity.CreateSecurityException(); } var senders = GetSubscribers(task); if (newStatus.StatusType == TaskStatus.Closed && !DisableNotifications && senders.Count != 0) { NotifyClient.Instance.SendAboutTaskClosing(senders, task); } if (newStatus.StatusType == TaskStatus.Open && !DisableNotifications && senders.Count != 0) { NotifyClient.Instance.SendAboutTaskResumed(senders, task); } task.Status = newStatus.StatusType; task.CustomTaskStatus = newStatus.Id < 0 ? null : (int?)newStatus.Id; task.LastModifiedBy = SecurityContext.CurrentAccount.ID; task.LastModifiedOn = TenantUtil.DateTimeNow(); task.StatusChangedOn = TenantUtil.DateTimeNow(); //subtask if (newStatus.StatusType == TaskStatus.Closed) { if (!task.Responsibles.Any()) { task.Responsibles.Add(SecurityContext.CurrentAccount.ID); } DaoFactory.SubtaskDao.CloseAllSubtasks(task); foreach (var subTask in task.SubTasks) { subTask.Status = TaskStatus.Closed; } } return(DaoFactory.TaskDao.Update(task)); }