Exemple #1
0
        public virtual void StartBlock7(Sungero.Docflow.Server.FreeApprovalNotificationArguments 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.Subject = Functions.Module.TrimSpecialSymbols(FreeApprovalTasks.Resources.NewApprovalLapSubject, _obj.ForApprovalGroup.ElectronicDocuments.First().Name);

            var approvalReworkAssignments = FreeApprovalReworkAssignments.GetAll(asg => asg.Task.Equals(_obj) && asg.TaskStartId == _obj.StartId);

            if (approvalReworkAssignments.Any())
            {
                var lastApprovalReworkAssignments = approvalReworkAssignments.OrderByDescending(asg => asg.Created).First();

                foreach (var recipient in lastApprovalReworkAssignments.Approvers.Where(apr => apr.Action == Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.SendNotice))
                {
                    e.Block.Performers.Add(recipient.Approver);
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Получить нестандартных исполнитлей задачи.
        /// </summary>
        /// <returns>Исполнители.</returns>
        public virtual List <IRecipient> GetTaskAdditionalAssignees()
        {
            var assignees = new List <IRecipient>();

            var freeApprovalTask = FreeApprovalTasks.As(_obj);

            if (freeApprovalTask == null)
            {
                return(assignees);
            }

            assignees.AddRange(freeApprovalTask.Approvers.Where(a => a.Approver != null).Select(a => a.Approver));

            var reworkAssignment = FreeApprovalReworkAssignments
                                   .GetAll(asg => Equals(asg.Task, _obj) && asg.TaskStartId == _obj.StartId)
                                   .OrderByDescending(asg => asg.Created)
                                   .FirstOrDefault();

            if (reworkAssignment != null)
            {
                assignees.AddRange(reworkAssignment.Approvers.Where(a => a.Approver != null).Select(a => a.Approver));
            }

            assignees.AddRange(freeApprovalTask.Observers.Where(a => a.Observer != null).Select(a => a.Observer));

            return(assignees.Distinct().ToList());
        }
Exemple #3
0
 public virtual void ApproversApproverValueInput(Sungero.Docflow.Client.FreeApprovalReworkAssignmentApproversApproverValueInputEventArgs e)
 {
     // Запрещено добавлять повторяющихся согласующих.
     if (FreeApprovalReworkAssignments.As(_obj.RootEntity).Approvers.Any(app => Equals(app.Approver, e.NewValue) && app.Id != _obj.Id))
     {
         e.AddError(_obj.Info.Properties.Approver, ApprovalReworkAssignments.Resources.CantAddApproverTwice);
     }
 }
Exemple #4
0
        public virtual void StartBlock2(Sungero.Docflow.Server.FreeApprovalAssignmentArguments e)
        {
            e.Block.IsParallel = true;
            e.Block.Subject    = Functions.Module.TrimSpecialSymbols(FreeApprovalTasks.Resources.ApproversAsgSubject,
                                                                     _obj.ForApprovalGroup.ElectronicDocuments.First().Name);

            var reworkAssignments = FreeApprovalReworkAssignments.GetAll(asg => asg.Task.Equals(_obj) && asg.TaskStartId == _obj.StartId);

            // Если заданий на доработку нет, то заполняем согласующих из задачи, если есть - то из последнего задания на доработку.
            if (!reworkAssignments.Any())
            {
                if (_obj.MaxDeadline.HasValue)
                {
                    e.Block.AbsoluteDeadline = _obj.MaxDeadline.Value;
                }
                foreach (var recipient in _obj.Approvers.OrderBy(apr => apr.Id))
                {
                    var approversList = Functions.FreeApprovalTask.GetUsersFromGroups(recipient.Approver);
                    foreach (var groupRecipient in approversList)
                    {
                        if (!e.Block.Performers.Contains(groupRecipient))
                        {
                            e.Block.Performers.Add(groupRecipient);
                        }
                    }
                }
                // Выдать права на документы всем согласующим, включая группы.
                Functions.FreeApprovalTask.GrantRightForAttachmentsToPerformers(_obj, _obj.Approvers.Select(apr => apr.Approver).ToList());
            }
            else
            {
                var lastReworkAssignment = reworkAssignments.OrderByDescending(asg => asg.Created).First();
                if (lastReworkAssignment.NewDeadline.HasValue)
                {
                    e.Block.AbsoluteDeadline = lastReworkAssignment.NewDeadline.Value;
                }
                _obj.MaxDeadline = lastReworkAssignment.NewDeadline;

                foreach (var element in lastReworkAssignment.Approvers.Where(asg => asg.Action == Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.SendForApproval))
                {
                    e.Block.Performers.Add(element.Approver);
                }
                // Выдать права на документы всем согласующим сотрудникам.
                Functions.FreeApprovalTask.GrantRightForAttachmentsToPerformers(_obj, e.Block.Performers.ToList());
            }
        }
Exemple #5
0
        public virtual IQueryable <Sungero.Workflow.IAssignmentBase> OnReworkDataQuery(IQueryable <Sungero.Workflow.IAssignmentBase> query)
        {
            // Фильтр по типу.
            var result = query
                         .Where(a => ApprovalReworkAssignments.Is(a) || FreeApprovalReworkAssignments.Is(a) ||
                                (ReportRequestAssignments.Is(a) && (ReportRequestAssignments.As(a).IsRework == true)));

            // Запрос непрочитанных без фильтра.
            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);
        }
Exemple #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);
        }
Exemple #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);
                }
            }
        }
Exemple #8
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);
        }
Exemple #9
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);
                }
            }
        }