Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
 /// <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());
 }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        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;
            }
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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);
                }
            }
        }
Ejemplo n.º 8
0
 /// <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());
 }