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 IQueryable <Sungero.Workflow.IAssignmentBase> OnApprovalDataQuery(IQueryable <Sungero.Workflow.IAssignmentBase> query)
        {
            // Фильтр по типу.
            var typeFilterEnabled     = _filter != null && (_filter.RuleBased || _filter.Free);
            var showRuleBasedApproval = !typeFilterEnabled || _filter.RuleBased;
            var showFreeApproval      = !typeFilterEnabled || _filter.Free;
            var result = query
                         .Where(a => showRuleBasedApproval && (ApprovalAssignments.Is(a) || ApprovalManagerAssignments.Is(a)) ||
                                showFreeApproval && FreeApprovalAssignments.Is(a));

            // Запрос непрочитанных без фильтра.
            if (_filter == null)
            {
                return(RecordManagement.PublicFunctions.Module.ApplyCommonSubfolderFilters(result));
            }

            // Фильтры по статусу, замещению и периоду.
            result = RecordManagement.PublicFunctions.Module.ApplyCommonSubfolderFilters(result, _filter.InProcess,
                                                                                         _filter.Last30Days, _filter.Last90Days, _filter.Last180Days, false);

            return(result);
        }
Ejemplo n.º 6
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.º 7
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);
        }
        public virtual void Script5Execute()
        {
            // Если родительское задание прекращено, то срок не продлять.
            if (_obj.ParentAssignment.Status != Workflow.AssignmentBase.Status.InProcess)
            {
                return;
            }

            var desiredDeadline = _obj.NewDeadline;

            if (RecordManagement.ActionItemExecutionAssignments.As(_obj.ParentAssignment) != null)
            {
                // Обновить срок у задания.
                var actionItemAssignment = RecordManagement.ActionItemExecutionAssignments.Get(_obj.ParentAssignment.Id);
                actionItemAssignment.Deadline      = desiredDeadline;
                actionItemAssignment.ScheduledDate = desiredDeadline;

                // Обновить срок у задачи.
                var actionItemExecution = RecordManagement.ActionItemExecutionTasks.Get(actionItemAssignment.Task.Id);
                actionItemExecution.Deadline    = desiredDeadline;
                actionItemExecution.MaxDeadline = desiredDeadline;

                // Обновить срок у составной задачи.
                if (actionItemExecution.ActionItemType == RecordManagement.ActionItemExecutionTask.ActionItemType.Component)
                {
                    var component  = RecordManagement.ActionItemExecutionTasks.Get(actionItemExecution.ParentTask.Id);
                    var actionItem = component.ActionItemParts.FirstOrDefault(j => Equals(j.Assignee, actionItemExecution.Assignee) &&
                                                                              (Equals(j.ActionItemPart, actionItemExecution.ActionItem) || string.IsNullOrEmpty(j.ActionItemPart)) &&
                                                                              (j.Deadline == _obj.CurrentDeadline || j.Deadline == null));
                    if (actionItem != null)
                    {
                        actionItem.Deadline = desiredDeadline;
                    }
                }

                // Продлить сроки соисполнителей.
                foreach (var performer in actionItemExecution.CoAssignees)
                {
                    var subTasks = RecordManagement.ActionItemExecutionTasks.GetAll(t => Equals(t.MainTask, actionItemExecution) &&
                                                                                    t.Status == Sungero.Workflow.Task.Status.InProcess &&
                                                                                    Equals(t.Assignee, performer.Assignee));
                    foreach (var subTask in subTasks)
                    {
                        subTask.Deadline    = desiredDeadline;
                        subTask.MaxDeadline = desiredDeadline;

                        // Продлить срок у активного задания соисполнителя.
                        var assignment = RecordManagement.ActionItemExecutionAssignments.GetAll()
                                         .FirstOrDefault(a => Equals(a.Task, subTask) && a.Status == Sungero.Workflow.AssignmentBase.Status.InProcess);

                        if (assignment != null)
                        {
                            assignment.Deadline      = desiredDeadline;
                            assignment.ScheduledDate = desiredDeadline;
                        }
                    }
                }
            }
            else if (RecordManagement.ReportRequestAssignments.Is(_obj.ParentAssignment))
            {
                // Обновить срок у задания.
                _obj.ParentAssignment.Deadline = desiredDeadline;
                // Обновить срок у задачи.
                var reportRequestTask = RecordManagement.StatusReportRequestTasks.Get(_obj.ParentAssignment.Task.Id);
                reportRequestTask.MaxDeadline = desiredDeadline;
            }
            else if (FreeApprovalAssignments.Is(_obj.ParentAssignment))
            {
                // Обновить срок у задания.
                var freeApprovalAssignment = FreeApprovalAssignments.Get(_obj.ParentAssignment.Id);
                freeApprovalAssignment.Deadline = desiredDeadline;

                // Обновить срок у задачи.
                var freeApprovalTask = FreeApprovalTasks.Get(_obj.ParentAssignment.Task.Id);
                if (Functions.Module.CheckDeadline(desiredDeadline, freeApprovalTask.MaxDeadline))
                {
                    freeApprovalTask.MaxDeadline = desiredDeadline;
                }
            }
            else if (ApprovalCheckReturnAssignments.Is(_obj.ParentAssignment))
            {
                // Обновить срок у задания.
                var checkReturnAssignment = ApprovalCheckReturnAssignments.As(_obj.ParentAssignment);
                checkReturnAssignment.Deadline = desiredDeadline;

                // Обновить срок на вкладке "Выдача" документа.
                if (checkReturnAssignment.DocumentGroup.OfficialDocuments.Any())
                {
                    var document = checkReturnAssignment.DocumentGroup.OfficialDocuments.FirstOrDefault();
                    ((Domain.Shared.IExtendedEntity)document).Params[Docflow.Constants.Module.DeadlineExtentsionTaskCallContext] = true;
                    var tracks = document.Tracking.Where(t => Equals(t.ReturnTask, checkReturnAssignment.Task) &&
                                                         t.ReturnResult == null && t.ReturnDeadline != null);
                    foreach (var track in tracks)
                    {
                        track.ReturnDeadline = desiredDeadline;
                    }
                }
            }
            else if (CheckReturnAssignments.Is(_obj.ParentAssignment))
            {
                // Обновить срок у задания.
                var checkReturnAssignment = CheckReturnAssignments.As(_obj.ParentAssignment);
                checkReturnAssignment.Deadline = desiredDeadline;
                if (CheckReturnTasks.Is(checkReturnAssignment.Task))
                {
                    var checkReturnTask = CheckReturnTasks.As(checkReturnAssignment.Task);
                    checkReturnTask.MaxDeadline = desiredDeadline;
                }
                // Обновить срок на вкладке "Выдача" документа.
                if (checkReturnAssignment.DocumentGroup.OfficialDocuments.Any())
                {
                    var document = checkReturnAssignment.DocumentGroup.OfficialDocuments.FirstOrDefault();
                    ((Domain.Shared.IExtendedEntity)document).Params[Docflow.Constants.Module.DeadlineExtentsionTaskCallContext] = true;
                    var tracks = document.Tracking.Where(t => Equals(t.ReturnTask, checkReturnAssignment.Task) &&
                                                         t.ReturnResult == null && t.ReturnDeadline != null);
                    foreach (var track in tracks)
                    {
                        track.ReturnDeadline = desiredDeadline;
                    }
                }
            }
            else
            {
                // Обновить срок у задания.
                _obj.ParentAssignment.Deadline = desiredDeadline;
            }

            // Обновить срок у задач.
            var parentAssignment = _obj.ParentAssignment;

            if (ApprovalTasks.Is(parentAssignment.MainTask))
            {
                var approvalTask = ApprovalTasks.As(parentAssignment.MainTask);
                approvalTask.MaxDeadline = Functions.ApprovalTask.GetExpectedDate(approvalTask);
            }
            else if (RecordManagement.AcquaintanceTasks.Is(parentAssignment.MainTask))
            {
                var acquaintanceTask = RecordManagement.AcquaintanceTasks.As(parentAssignment.MainTask);
                if (Functions.Module.CheckDeadline(desiredDeadline, acquaintanceTask.Deadline))
                {
                    acquaintanceTask.Deadline = desiredDeadline;
                }
            }
        }
Ejemplo n.º 9
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.º 10
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());
 }
Ejemplo n.º 11
0
        /// <summary>
        /// Получить заголовок.
        /// </summary>
        /// <param name="assignment">Задание.</param>
        /// <returns>Информация о задании: исполнитель, срок, результат - отформатированная для предметного отображения.</returns>
        public Structures.FreeApprovalTask.AssignmentInfo GetPerformerAndDeadlineAndStatus(IAssignment assignment)
        {
            var performerName = PublicFunctions.OfficialDocument.GetAuthor(assignment.Performer, assignment.CompletedBy);
            var actionLabel   = string.Empty;
            var emptyResult   = Structures.FreeApprovalTask.AssignmentInfo.Create(string.Empty, string.Empty, string.Empty);

            // Задание завершено.
            if (assignment.Status == Workflow.AssignmentBase.Status.Completed)
            {
                // Согласование.
                if (FreeApprovalAssignments.Is(assignment))
                {
                    if (assignment.Result == Docflow.FreeApprovalAssignment.Result.Approved)
                    {
                        actionLabel = ApprovalTasks.Resources.StateViewEndorsed;
                    }
                    else if (assignment.Result == Docflow.FreeApprovalAssignment.Result.ForRework)
                    {
                        actionLabel = ApprovalTasks.Resources.StateViewNotApproved;
                    }
                    else if (assignment.Result == Docflow.FreeApprovalAssignment.Result.Forward)
                    {
                        actionLabel = ApprovalTasks.Resources.StateViewForwarded;
                    }
                    else
                    {
                        return(emptyResult);
                    }
                }

                // Задание на завершение согласования.
                if (FreeApprovalFinishAssignments.Is(assignment))
                {
                    if (assignment.Result == Docflow.FreeApprovalFinishAssignment.Result.Complete)
                    {
                        actionLabel = ApprovalTasks.Resources.StateViewDone;
                    }
                    else
                    {
                        return(emptyResult);
                    }
                }

                // Прекращение на доработке.
                if (FreeApprovalReworkAssignments.Is(assignment) && assignment.Status == Workflow.AssignmentBase.Status.Aborted)
                {
                    actionLabel = ApprovalTasks.Resources.StateViewAborted;
                }

                var completed = Functions.Module.ToShortDateShortTime(assignment.Completed.Value.ToUserTime());

                if (!string.IsNullOrWhiteSpace(actionLabel))
                {
                    return(Structures.FreeApprovalTask.AssignmentInfo.Create(string.Format("{0} ", performerName), string.Format("{0}: {1}", OfficialDocuments.Resources.StateViewDate, completed), actionLabel));
                }
            }

            // Задание в работе или прекращено.
            if (assignment.Status == Workflow.AssignmentBase.Status.InProcess ||
                assignment.Status == Workflow.AssignmentBase.Status.Aborted ||
                assignment.Status == Workflow.AssignmentBase.Status.Suspended)
            {
                var status = ApprovalTasks.Resources.StateViewAborted.ToString();
                if (assignment.Status == Workflow.AssignmentBase.Status.InProcess)
                {
                    status = assignment.IsRead == true ? ApprovalTasks.Resources.StateViewInProcess : ApprovalTasks.Resources.StateViewUnRead;
                }

                var deadline = assignment.Deadline.HasValue ?
                               Functions.Module.ToShortDateShortTime(assignment.Deadline.Value.ToUserTime()) :
                               OfficialDocuments.Resources.StateViewWithoutTerm;

                return(Structures.FreeApprovalTask.AssignmentInfo.Create(string.Format("{0} ", performerName), string.Format("{0}: {1}", OfficialDocuments.Resources.StateViewDeadline, deadline), status));
            }

            return(emptyResult);
        }
Ejemplo n.º 12
0
        public Sungero.Core.StateView GetStateView()
        {
            // Добавить заголовок.
            var stateView = StateView.Create();

            var taskBeginText = _obj.Texts.OrderBy(t => t.Created).FirstOrDefault();
            var comment       = taskBeginText != null ? taskBeginText.Body : string.Empty;

            comment = comment != FreeApprovalTasks.Resources.ApprovalText ? comment : string.Empty;
            if (_obj.Started.HasValue)
            {
                Docflow.PublicFunctions.OfficialDocument
                .AddUserActionBlock(stateView, _obj.Author, ApprovalTasks.Resources.StateViewDocumentSentForApproval, _obj.Started.Value, _obj, comment, _obj.StartedBy);
            }
            else
            {
                Docflow.PublicFunctions.OfficialDocument
                .AddUserActionBlock(stateView, _obj.Author, ApprovalTasks.Resources.StateViewTaskDrawCreated, _obj.Created.Value, _obj, comment, _obj.Author);
            }

            // Добавить основной блок для задачи.
            var taskBlock = this.AddTaskBlock(stateView);

            // Получить все задания по задаче.
            var taskAssignments = Assignments.GetAll().Where(a => Equals(a.Task, _obj)).ToList();

            // Определить итерации.
            var iterations = Functions.Module.GetIterationDates(_obj);

            // Обработать каждую итерацию.
            foreach (var iteration in iterations)
            {
                var date             = iteration.Date;
                var hasReworkBefore  = iteration.IsRework;
                var hasRestartBefore = iteration.IsRestart;

                var nextIteration = iterations.Where(d => d.Date > date).FirstOrDefault();
                var nextDate      = Calendar.Now;

                if (nextIteration != null)
                {
                    nextDate = nextIteration.Date;
                }

                // Получить задания в рамках круга согласования.
                var assignments = taskAssignments
                                  .Where(a => a.Created >= date && a.Created < nextDate)
                                  .OrderBy(a => a.Created)
                                  .ToList();

                // Если нет заданий, то перейти к следующей итерации.
                if (!assignments.Any())
                {
                    continue;
                }

                // Добавить блок отправки.
                this.AddSendForApprovalBlock(taskBlock, assignments.First(), hasReworkBefore, hasRestartBefore);

                StateBlock parentBlock = null;

                // Выделить этап согласования.
                var approvalAssignments = assignments.Where(a => FreeApprovalAssignments.Is(a));
                if (approvalAssignments.Any())
                {
                    // Вставить блок для группировки этапа согласования.
                    var iterationBlock = taskBlock.AddChildBlock();
                    iterationBlock.NeedGroupChildren = true;
                    iterationBlock.IsExpanded        = approvalAssignments.Any(a => a.Status == Workflow.AssignmentBase.Status.InProcess);

                    // Заголовок блока итерации.
                    iterationBlock.AddLabel(ApprovalTasks.Resources.StateViewApprovalStage, Docflow.PublicFunctions.Module.CreateHeaderStyle());
                    iterationBlock.AddLineBreak();

                    // Добавить информацию по исполнителям группы согласования.
                    var performersLabel = string.Join(", ", approvalAssignments
                                                      .Select(a => a.Performer)
                                                      .Distinct()
                                                      .Select(a => (Sungero.Company.Employees.Is(a) ?
                                                                    Company.PublicFunctions.Employee.GetShortName(Sungero.Company.Employees.As(a), false) :
                                                                    a.Name)));
                    iterationBlock.AddLabel(performersLabel, Docflow.PublicFunctions.Module.CreatePerformerDeadlineStyle());

                    parentBlock = iterationBlock;
                }

                // Добавить задания.
                assignments = assignments.OrderByDescending(a => a.Result.HasValue).ThenBy(a => a.Completed).ToList();
                this.AddAssignmentsBlocks(parentBlock, taskBlock, assignments);

                // Установить иконку и статус для группировки этапа согласования.
                var endStatus = string.Empty;
                if (parentBlock != null)
                {
                    // Иконка по умолчанию.
                    parentBlock.AssignIcon(FreeApprovalTasks.Resources.FreeApproveStage, StateBlockIconSize.Large);

                    if (approvalAssignments.Any(a => a.Result == Docflow.FreeApprovalAssignment.Result.ForRework))
                    {
                        parentBlock.AssignIcon(ApprovalTasks.Resources.Notapprove, StateBlockIconSize.Large);
                        endStatus = ApprovalTasks.Resources.StateViewNotApproved;
                    }
                    else if (!approvalAssignments.Any(a => a.Result != Docflow.FreeApprovalAssignment.Result.Approved))
                    {
                        parentBlock.AssignIcon(ApprovalTasks.Resources.Approve, StateBlockIconSize.Large);
                        endStatus = ApprovalTasks.Resources.StateViewEndorsed;
                    }

                    if (assignments.Any(a => a.Status == Workflow.AssignmentBase.Status.Aborted))
                    {
                        parentBlock.AssignIcon(StateBlockIconType.Abort, StateBlockIconSize.Large);
                        endStatus = ApprovalTasks.Resources.StateViewAborted;
                    }

                    Functions.Module.AddInfoToRightContent(parentBlock, parentBlock.IsExpanded ? ApprovalTasks.Resources.StateViewInProcess : endStatus);
                }
            }

            return(stateView);
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Установить иконку задания.
        /// </summary>
        /// <param name="block">Блок задания.</param>
        /// <param name="assignment">Задание.</param>
        public void SetIcon(Sungero.Core.StateBlock block, IAssignment assignment)
        {
            // Размер иконок: большой, если не задание согласования.
            var iconSize = StateBlockIconSize.Large;

            if (FreeApprovalAssignments.Is(assignment))
            {
                iconSize = StateBlockIconSize.Small;
            }

            block.AssignIcon(StateBlockIconType.OfEntity, iconSize);

            if (assignment.Result != null)
            {
                // Согласовано.
                if (assignment.Result == Docflow.FreeApprovalAssignment.Result.Approved)
                {
                    iconSize = StateBlockIconSize.Small;
                    block.AssignIcon(ApprovalTasks.Resources.Approve, iconSize);
                }

                // На доработку.
                if (assignment.Result == Docflow.FreeApprovalAssignment.Result.ForRework)
                {
                    iconSize = StateBlockIconSize.Small;
                    block.AssignIcon(ApprovalTasks.Resources.Notapprove, iconSize);
                }

                // На повторное согласование.
                if (assignment.Result == Docflow.FreeApprovalReworkAssignment.Result.Reworked)
                {
                    block.AssignIcon(StateBlockIconType.User, iconSize);
                    block.ShowBorder = false;
                    block.DockType   = DockType.Bottom;
                }

                // Выполнено.
                if (assignment.Result == Docflow.FreeApprovalFinishAssignment.Result.Complete)
                {
                    block.AssignIcon(ApprovalTasks.Resources.Completed, iconSize);
                }

                // Переадресовано.
                if (assignment.Result == Docflow.FreeApprovalAssignment.Result.Forward)
                {
                    block.AssignIcon(FreeApprovalTasks.Resources.Forward, iconSize);
                }

                // Прекращено
                if (assignment.Status == Workflow.AssignmentBase.Status.Aborted)
                {
                    block.AssignIcon(StateBlockIconType.Abort, iconSize);
                }
            }

            // Прекращено, остановлено по ошибке.
            if (assignment.Status == Workflow.AssignmentBase.Status.Aborted ||
                assignment.Status == Workflow.AssignmentBase.Status.Suspended)
            {
                block.AssignIcon(StateBlockIconType.Abort, iconSize);
            }
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Добавить задания свободного согласования.
        /// </summary>
        /// <param name="parentBlock">Блок группировки.</param>
        /// <param name="taskBlock">Блок задачи.</param>
        /// <param name="assignments">Список заданий в рамках этапа согласования.</param>
        public void AddAssignmentsBlocks(Sungero.Core.StateBlock parentBlock, Sungero.Core.StateBlock taskBlock, List <IAssignment> assignments)
        {
            foreach (var assignment in assignments)
            {
                var noteStyle              = Functions.Module.CreateNoteStyle();
                var separatorStyle         = Docflow.PublicFunctions.Module.CreateSeparatorStyle();
                var performerDeadlineStyle = Docflow.PublicFunctions.Module.CreatePerformerDeadlineStyle();

                var performerAndDeadlineAndStatus = this.GetPerformerAndDeadlineAndStatus(assignment);
                var performer = performerAndDeadlineAndStatus.Performer;
                var deadline  = performerAndDeadlineAndStatus.Deadline;
                var status    = performerAndDeadlineAndStatus.Status;

                if (string.IsNullOrWhiteSpace(performer))
                {
                    continue;
                }

                StateBlock block;
                if (parentBlock != null && FreeApprovalAssignments.Is(assignment))
                {
                    block = parentBlock.AddChildBlock();
                }
                else
                {
                    block = taskBlock.AddChildBlock();
                }

                this.SetIcon(block, assignment);

                block.Entity = assignment;

                // Заголовок блока с заданием о завершении или доработке.
                if (!FreeApprovalAssignments.Is(assignment))
                {
                    var blockLabel = string.Empty;
                    if (FreeApprovalFinishAssignments.Is(assignment))
                    {
                        blockLabel = FreeApprovalTasks.Resources.StateViewCompleteApprovalAssignment;
                    }
                    else if (FreeApprovalReworkAssignments.Is(assignment))
                    {
                        blockLabel = FreeApprovalTasks.Resources.StateViewReworkByRemarks;
                    }

                    block.AddLabel(blockLabel, Docflow.PublicFunctions.Module.CreateHeaderStyle());
                    block.AddLineBreak();
                }

                // Заполнить участников.
                var performerLabel = string.Format("{0}{1}", performer, deadline);
                block.AddLabel(performerLabel, performerDeadlineStyle);

                var comment = Docflow.Functions.Module.GetAssignmentUserComment(assignment);
                if (!string.IsNullOrWhiteSpace(comment))
                {
                    block.AddLineBreak();
                    block.AddLabel(Constants.Module.SeparatorText, separatorStyle);
                    block.AddLineBreak();
                    block.AddEmptyLine(Constants.Module.EmptyLineMargin);
                    block.AddLabel(comment, noteStyle);
                }

                // Заполнить статус задания и просрочку.
                Functions.Module.AddInfoToRightContent(block, status);

                if (assignment.Status == Workflow.AssignmentBase.Status.InProcess && assignment.Deadline.HasValue)
                {
                    Functions.OfficialDocument.AddDeadlineHeaderToRight(block, assignment.Deadline.Value, assignment.Performer);
                }
            }
        }