コード例 #1
0
        /// <summary>
        /// Определить необходимость задания на создание поручений.
        /// </summary>
        /// <param name="task">Согласование.</param>
        /// <returns>True, если нужно, иначе - false.</returns>
        public static bool NeedExecutionAssignment(IApprovalTask task)
        {
            var reviewAssignments = ApprovalReviewAssignments.GetAll()
                                    .Where(a => Equals(a.Task, task))
                                    .Where(a => a.Status == Workflow.AssignmentBase.Status.Completed);
            var hasReviewAssignments = reviewAssignments.Any();
            var hasReviewAssignmentsWithResolution = reviewAssignments
                                                     .Any(a => a.Result == Docflow.ApprovalReviewAssignment.Result.AddResolution);

            // Если вынесена резолюция, то создание поручений нужно.
            if (hasReviewAssignmentsWithResolution)
            {
                return(true);
            }

            // Если рассмотрение есть (без резолюции), то создание поручений не нужно.
            if (hasReviewAssignments)
            {
                return(false);
            }

            // Если нет рассмотрения, но есть подписание, то создание поручений нужно.
            var hasSignAssignments = ApprovalSigningAssignments.GetAll().Any(a => Equals(a.Task, task));

            if (hasSignAssignments)
            {
                return(true);
            }

            return(true);
        }
コード例 #2
0
        public override void BeforeAbort(Sungero.Workflow.Server.BeforeAbortEventArgs e)
        {
            // Если прекращён черновик, прикладную логику по прекращению выполнять не надо.
            if (_obj.State.Properties.Status.OriginalValue == Workflow.Task.Status.Draft)
            {
                return;
            }

            var document = _obj.DocumentGroup.OfficialDocuments.First();

            var subject       = string.Empty;
            var threadSubject = string.Empty;

            // Отправить уведомления о прекращении.
            using (TenantInfo.Culture.SwitchTo())
            {
                threadSubject = ApprovalTasks.Resources.AbortNoticeSubject;
                subject       = string.Format(Sungero.Exchange.Resources.TaskSubjectTemplate, threadSubject, Docflow.PublicFunctions.Module.TrimSpecialSymbols(document.Name));
            }

            var allApprovers = ApprovalAssignments.GetAll(asg => asg.Task == _obj && asg.IsRead.Value).Select(app => app.Performer).ToList();

            allApprovers.AddRange(ApprovalManagerAssignments.GetAll(asg => asg.Task == _obj && asg.IsRead.Value).Select(app => app.Performer).ToList());
            allApprovers.AddRange(ApprovalSigningAssignments.GetAll(asg => asg.Task == _obj && asg.IsRead.Value).Select(app => app.Performer).ToList());
            var author           = _obj.Author;
            var reworkAssignment = Functions.ApprovalTask.GetLastReworkAssignment(_obj);

            if (reworkAssignment != null)
            {
                allApprovers.Add(reworkAssignment.Performer);
                if (!Equals(_obj.Author, reworkAssignment.Performer))
                {
                    allApprovers.Add(_obj.Author);
                    author = reworkAssignment.Performer;
                }
            }
            allApprovers.Remove(Users.Current);
            if (allApprovers.Any())
            {
                Functions.Module.SendNoticesAsSubtask(subject, allApprovers, _obj, _obj.AbortingReason, author, threadSubject);
            }

            // Обновить статус согласования - аннулирован.
            Functions.ApprovalTask.UpdateApprovalState(_obj, OfficialDocument.InternalApprovalState.Aborted);
        }
コード例 #3
0
        public virtual IQueryable <Sungero.Workflow.IAssignmentBase> OnDocumentProcessingDataQuery(IQueryable <Sungero.Workflow.IAssignmentBase> query)
        {
            // Фильтр по типу.
            var typeFilterEnabled = _filter != null && (_filter.ProcessResolution ||
                                                        _filter.ConfirmSigning ||
                                                        _filter.SendActionItem ||
                                                        _filter.Send ||
                                                        _filter.CheckReturn ||
                                                        _filter.Other);

            var stageTypes = new List <Sungero.Core.Enumeration>();

            if (!typeFilterEnabled || _filter.ProcessResolution)
            {
                stageTypes.Add(Docflow.ApprovalReviewAssignmentCollapsedStagesTypesRe.StageType.ReviewingResult);
            }
            if (!typeFilterEnabled || _filter.ConfirmSigning)
            {
                stageTypes.Add(Docflow.ApprovalReviewAssignmentCollapsedStagesTypesRe.StageType.ConfirmSign);
            }
            if (!typeFilterEnabled || _filter.SendActionItem)
            {
                stageTypes.Add(Docflow.ApprovalReviewAssignmentCollapsedStagesTypesRe.StageType.Execution);
            }
            if (!typeFilterEnabled || _filter.Send)
            {
                stageTypes.Add(Docflow.ApprovalReviewAssignmentCollapsedStagesTypesRe.StageType.Sending);
            }

            var showExecution   = !typeFilterEnabled || _filter.SendActionItem;
            var showCheckReturn = !typeFilterEnabled || _filter.CheckReturn;
            var showOther       = !typeFilterEnabled || _filter.Other;

            var result = query.Where(q =>
                                     // Рассмотрение.
                                     ApprovalReviewAssignments.Is(q) && ApprovalReviewAssignments.As(q).CollapsedStagesTypesRe.Any(s => stageTypes.Contains(s.StageType.Value)) ||
                                     // Подписание.
                                     ApprovalSigningAssignments.Is(q) && ApprovalSigningAssignments.As(q).CollapsedStagesTypesSig.Any(s => stageTypes.Contains(s.StageType.Value)) ||
                                     // Создание поручений.
                                     (ApprovalExecutionAssignments.Is(q) && ApprovalExecutionAssignments.As(q).CollapsedStagesTypesExe.Any(s => stageTypes.Contains(s.StageType.Value)) ||
                                      showExecution && ReviewResolutionAssignments.Is(q)) ||
                                     // Подготовка проекта резолюции.
                                     showExecution && PreparingDraftResolutionAssignments.Is(q) ||
                                     // Регистрация.
                                     ApprovalRegistrationAssignments.Is(q) && ApprovalRegistrationAssignments.As(q).CollapsedStagesTypesReg.Any(s => stageTypes.Contains(s.StageType.Value)) ||
                                     // Печать.
                                     ApprovalPrintingAssignments.Is(q) && ApprovalPrintingAssignments.As(q).CollapsedStagesTypesPr.Any(s => stageTypes.Contains(s.StageType.Value)) ||
                                     // Отправка контрагенту.
                                     ApprovalSendingAssignments.Is(q) && ApprovalSendingAssignments.As(q).CollapsedStagesTypesSen.Any(s => stageTypes.Contains(s.StageType.Value)) ||
                                     // Контроль возврата.
                                     showCheckReturn && ApprovalCheckReturnAssignments.Is(q) ||
                                     // Прочие задания.
                                     showOther && (ApprovalSimpleAssignments.Is(q) || ApprovalCheckingAssignments.Is(q)));

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