/// <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); }
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); }
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); }