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); }