public virtual bool CanForwardTo(Company.IEmployee employee) { var assignments = FreeApprovalAssignments.GetAll(a => Equals(a.Task, _obj.Task) && Equals(a.TaskStartId, _obj.TaskStartId) && Equals(a.IterationId, _obj.IterationId)); // Если у сотрудника есть хоть одно задание в работе - считаем, что нет смысла дублировать ему задания. // BUG: если assignments материализовать (завернуть ToList), то в задании можно будет переадресовать самому себе, т.к. в BeforeComplete задание считается уже выполненным. var hasInProcess = assignments.Where(a => Equals(a.Status, Status.InProcess) && Equals(a.Performer, employee)).Any(); if (hasInProcess) { return(false); } var materialized = assignments.ToList(); // Если у сотрудника нет заданий в работе, проверяем, все ли его задания созданы. foreach (var assignment in materialized) { var added = assignment.ForwardedTo.Count(u => Equals(u, employee)); var created = materialized.Count(a => Equals(a.Performer, employee) && Equals(a.ForwardedFrom, assignment)); if (added != created) { return(false); } } return(true); }
public virtual void StartAssignment3(Sungero.Docflow.IFreeApprovalReworkAssignment assignment, Sungero.Docflow.Server.FreeApprovalReworkAssignmentArguments e) { var lastAssignment = FreeApprovalAssignments.GetAll() .Where(ass => Equals(ass.Task, _obj) && ass.Result == Docflow.FreeApprovalAssignment.Result.ForRework) .OrderByDescending(o => o.Completed) .FirstOrDefault(); assignment.Author = lastAssignment.Performer; }
/// <summary> /// Получить все завершенные задания последней итерации с результатом на доработку, для которых не созданы уведомления. /// </summary> /// <param name="task">Задача.</param> /// <param name="lastIterationId">Ид последней итерации.</param> /// <returns>Список заданий.</returns> public static List <IFreeApprovalAssignment> GetLastAssignmentWithoutNotice(IFreeApprovalTask task, int?lastIterationId) { return(FreeApprovalAssignments.GetAll(asg => asg.Task.Equals(task) && asg.TaskStartId == task.StartId && asg.IterationId == lastIterationId && asg.Status == Sungero.Workflow.AssignmentBase.Status.Completed && asg.Result == Sungero.Docflow.FreeApprovalAssignment.Result.ForRework && !FreeApprovalNotifications.GetAll().Any(n => Equals(n.LinkedFreeApprovalAssignment, asg))).ToList()); }
public virtual bool Monitoring10Result() { var lastIterationId = Functions.FreeApprovalTask.GetApprovalAssignmentLastIterationId(_obj); if (FreeApprovalAssignments.GetAll(asg => asg.Task.Equals(_obj) && asg.TaskStartId == _obj.StartId && asg.IterationId == lastIterationId && asg.Status == Sungero.Workflow.AssignmentBase.Status.InProcess).Any()) { return(Functions.FreeApprovalTask.GetLastAssignmentWithoutNotice(_obj, lastIterationId).Any()); } else { return(false); } }
public virtual void CompleteAssignment2(Sungero.Docflow.IFreeApprovalAssignment assignment, Sungero.Docflow.Server.FreeApprovalAssignmentArguments e) { Functions.FreeApprovalTask.SynchronizeAddendaAndAttachmentsGroup(_obj); // Выдать права на приложения. var recipientsToGrantRights = Functions.Module.GetTaskAssignees(_obj); Functions.FreeApprovalTask.GrantRightForAttachmentsToPerformers(_obj, recipientsToGrantRights); var assignmentsInWork = FreeApprovalAssignments.GetAll(asg => asg.Task.Equals(_obj) && asg.TaskStartId == _obj.StartId && asg.Status == Sungero.Workflow.AssignmentBase.Status.InProcess); if (assignment.Result == Sungero.Docflow.FreeApprovalAssignment.Result.ForRework && _obj.ReceiveNotice == true && _schemeVersion >= SchemeVersions.V2 && assignmentsInWork.Any()) { var notice = FreeApprovalNotifications.Create(_obj); notice.Performer = _obj.Author; var lastIterationId = Functions.FreeApprovalTask.GetApprovalAssignmentLastIterationId(_obj); var firstApprovalAssignment = Functions.FreeApprovalTask.GetLastAssignmentWithoutNotice(_obj, lastIterationId).First(); notice.LinkedFreeApprovalAssignment = firstApprovalAssignment; notice.Author = firstApprovalAssignment.Performer; var subject = Functions.Module.TrimSpecialSymbols(FreeApprovalTasks.Resources.ReworkNoticeSubject, _obj.ForApprovalGroup.ElectronicDocuments.First().Name); notice.Subject = subject.Length > FreeApprovalNotifications.Info.Properties.Subject.Length ? subject.Substring(0, FreeApprovalNotifications.Info.Properties.Subject.Length) : subject; } if (assignment.Result == Sungero.Docflow.FreeApprovalAssignment.Result.Forward) { assignment.Forward(assignment.Addressee, ForwardingLocation.Next, assignment.AddresseeDeadline); var approver = _obj.Approvers.Where(x => Equals(x.Approver, assignment.Performer)).FirstOrDefault(); _obj.Approvers.Remove(approver); var newApprover = _obj.Approvers.AddNew(); newApprover.Approver = assignment.Addressee; } }
public virtual bool Decision12Result() { var currentTaskStartId = _obj.StartId; var minAssignmentDate = Assignments.GetAll(a => Equals(a.Task, _obj) && a.TaskStartId == currentTaskStartId).Min(a => a.Created); var reworkAssignments = FreeApprovalReworkAssignments.GetAll(a => Equals(a.Task, _obj) && a.TaskStartId == currentTaskStartId); DateTime lastIterationDate; if (reworkAssignments.Any()) { var maxCreated = reworkAssignments.Max(a => a.Created); lastIterationDate = maxCreated > minAssignmentDate ? maxCreated.Value : minAssignmentDate.Value; } else { lastIterationDate = minAssignmentDate.Value; } var needRework = false; var approvalAssignments = FreeApprovalAssignments.GetAll() .Where(a => Equals(a.Task, _obj) && a.Created >= lastIterationDate) .ToList(); foreach (var assignment in approvalAssignments.Where(a => a.Result == Docflow.FreeApprovalAssignment.Result.ForRework)) { var hasApprovedAssignment = approvalAssignments.Any(a => Equals(a.Performer, assignment.Performer) && a.Modified > assignment.Modified && Equals(a.Result, Docflow.FreeApprovalAssignment.Result.Approved)); if (!hasApprovedAssignment) { needRework = true; break; } } return(needRework); }
public virtual void StartBlock3(Sungero.Docflow.Server.FreeApprovalReworkAssignmentArguments e) { // Синхронизировать группу приложений документа. var document = _obj.ForApprovalGroup.ElectronicDocuments.FirstOrDefault(); Functions.Module.SynchronizeAddendaAndAttachmentsGroup(_obj.AddendaGroup, document); if (OfficialDocuments.Is(document)) { Functions.OfficialDocument.AddRelatedDocumentsToAttachmentGroup(OfficialDocuments.As(document), _obj.OtherGroup); } e.Block.Performers.Add(_obj.Author); e.Block.RelativeDeadlineDays = 3; e.Block.Subject = Functions.Module.TrimSpecialSymbols(FreeApprovalTasks.Resources.RevisionAsgSubject, _obj.ForApprovalGroup.ElectronicDocuments.First().Name); if (_obj.MaxDeadline.HasValue) { e.Block.NewDeadline = _obj.MaxDeadline; } var approvalAssignments = FreeApprovalAssignments.GetAll(asg => asg.Task.Equals(_obj) && asg.TaskStartId == _obj.StartId); var reworkAssignments = FreeApprovalReworkAssignments.GetAll(asg => asg.Task.Equals(_obj) && asg.TaskStartId == _obj.StartId); var lastIterationId = Functions.FreeApprovalTask.GetApprovalAssignmentLastIterationId(_obj); // Если заданий на доработку не было, то заполняем всю таблицу из заданий по задаче, // если были - то исполнителей берем из последнего задания на доработку, а результат и действие заполняем по последним заданиям на согласование. if (!reworkAssignments.Any()) { foreach (var aprAssignment in approvalAssignments.Where(asg => asg.IterationId == lastIterationId).OrderBy(i => i.Created)) { Functions.FreeApprovalTask.AddToReworkAssigneeNewApprover(e, aprAssignment); } } else { var approvalReworkAssignmentFromLastIteration = reworkAssignments.OrderByDescending(asg => asg.Created).First(); foreach (var asgApprover in approvalReworkAssignmentFromLastIteration.Approvers.OrderBy(asg => asg.Id)) { // Копируем все значения. var newApprover = e.Block.Approvers.FirstOrDefault(a => Equals(a.Approver, asgApprover.Approver)) ?? e.Block.Approvers.AddNew(); newApprover.Approver = asgApprover.Approver; newApprover.Approved = asgApprover.Approved; newApprover.Action = asgApprover.Action; // Если результат согласования изменился \ согласование не было выполнено - перебиваем данные. var lastApprovalAsg = approvalAssignments.Where(asg => asg.Performer.Equals(asgApprover.Approver)).OrderByDescending(asg => asg.IterationId).ThenByDescending(asg => asg.Modified).FirstOrDefault(); if (lastApprovalAsg != null) { if (lastApprovalAsg.Result == Sungero.Docflow.FreeApprovalAssignment.Result.Approved) { newApprover.Approved = Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Approved.IsApproved; newApprover.Action = newApprover.Action == Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.SendForApproval ? Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.SendNotice : Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.DoNotSend; } else if (lastApprovalAsg.Result == Sungero.Docflow.FreeApprovalAssignment.Result.Forward) { newApprover.Approved = Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Approved.NotApproved; newApprover.Action = Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.DoNotSend; } else { newApprover.Approved = Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Approved.NotApproved; newApprover.Action = Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.SendForApproval; } } } foreach (var newApproval in approvalAssignments.Where(a => a.IterationId == lastIterationId).OrderBy(i => i.Created)) { Functions.FreeApprovalTask.AddToReworkAssigneeNewApprover(e, newApproval); } } }
/// <summary> /// Получить номер последней итерации заданий на согласование. /// </summary> /// <param name="task">Задача.</param> /// <returns>Номер итерации.</returns> public static int?GetApprovalAssignmentLastIterationId(IFreeApprovalTask task) { return(FreeApprovalAssignments.GetAll(asg => asg.Task.Equals(task) && asg.TaskStartId == task.StartId).Select(asg => asg.IterationId).Max()); }