/// <summary> /// Получить задание руководителю. /// </summary> /// <param name="startDate">Дата начала текущей итерации рассмотрения.</param> /// <returns>Задание руководителю.</returns> private IAssignment GetManagerAssignment(DateTime startDate) { return(Assignments.GetAll() .Where(a => Equals(a.Task, _obj)) .Where(a => a.Created >= startDate) .Where(a => ReviewManagerAssignments.Is(a) || ReviewDraftResolutionAssignments.Is(a)) .OrderByDescending(a => a.Created) .FirstOrDefault()); }
public virtual void StartBlock11(Sungero.RecordManagement.Server.PreparingDraftResolutionAssignmentArguments e) { var addressee = Employees.As(_obj.Addressee); var assistant = Docflow.PublicFunctions.Module.GetSecretary(addressee); // Добавить адресата в качестве исполнителя. e.Block.Performers.Add(assistant); // Вычислить дедлайн задания. // На подготовку проекта резолюции 4 часа. e.Block.RelativeDeadlineHours = 4; // Проставляем признак того, что задание для доработки. var lastReview = Assignments .GetAll(a => Equals(a.Task, _obj) && Equals(a.TaskStartId, _obj.StartId)) .OrderByDescending(a => a.Created) .FirstOrDefault(); if (lastReview != null && ReviewDraftResolutionAssignments.Is(lastReview) && lastReview.Result == RecordManagement.ReviewDraftResolutionAssignment.Result.AddResolution) { e.Block.IsRework = true; } var document = _obj.DocumentForReviewGroup.OfficialDocuments.First(); var result = Functions.DocumentReviewTask.GetLastAssignmentResult(_obj); if (result != RecordManagement.ReviewDraftResolutionAssignment.Result.AddResolution) { e.Block.Subject = Docflow.PublicFunctions.Module.TrimSpecialSymbols(DocumentReviewTasks.Resources.PrepareDraftResolution, document.Name); } else { e.Block.Subject = Docflow.PublicFunctions.Module.TrimSpecialSymbols(DocumentReviewTasks.Resources.ReworkPrepareDraftResolution, document.Name); } Docflow.PublicFunctions.Module.SynchronizeAddendaAndAttachmentsGroup(_obj.AddendaGroup, document); // Выдать исполнителю права на вложения. Functions.DocumentReviewTask.GrantRightForAttachmentsToAssignees(_obj, e.Block.Performers.ToList()); }
public override void BeforeStart(Sungero.Workflow.Server.BeforeStartEventArgs e) { // Если задача была стартована через UI, то проверяем корректность срока. bool startedFromUI; if (e.Params.TryGetValue(PublicConstants.ActionItemExecutionTask.CheckDeadline, out startedFromUI) && startedFromUI) { e.Params.Remove(PublicConstants.ActionItemExecutionTask.CheckDeadline); } if (!Functions.ActionItemExecutionTask.ValidateActionItemExecutionTaskStart(_obj, e, startedFromUI)) { return; } // Задать текст в переписке. if (_obj.IsCompoundActionItem == true) { _obj.ActiveText = string.IsNullOrEmpty(_obj.ActionItem) ? Sungero.RecordManagement.ActionItemExecutionTasks.Resources.DefaultActionItem : _obj.ActionItem; _obj.ThreadSubject = Sungero.RecordManagement.ActionItemExecutionTasks.Resources.CompoundActionItemThreadSubject; } else if (_obj.ActionItemType != ActionItemType.Component) { _obj.ThreadSubject = Sungero.RecordManagement.ActionItemExecutionTasks.Resources.ActionItemThreadSubject; } if (_obj.ActionItemType == ActionItemType.Component) { _obj.ActiveText = _obj.ActionItem; // При рестарте поручения обновляется текст, срок и исполнитель в табличной части составного поручения. var actionItem = ActionItemExecutionTasks.As(_obj.ParentTask).ActionItemParts.FirstOrDefault(s => Equals(s.ActionItemPartExecutionTask, _obj)); // Обновить текст поручения, если изменен индивидуальный текст или указан общий текст вместо индивидуального. if (actionItem.ActionItemExecutionTask.ActionItem != _obj.ActionItem && actionItem.ActionItemPart != _obj.ActionItem || actionItem.ActionItemExecutionTask.ActionItem == _obj.ActionItem && !string.IsNullOrEmpty(actionItem.ActionItemPart)) { actionItem.ActionItemPart = _obj.ActionItem; } // Обновить срок поручения, если изменен индивидуальный срок или указан общий срок вместо индивидуального. if (actionItem.ActionItemExecutionTask.FinalDeadline != _obj.Deadline && actionItem.Deadline != _obj.Deadline || actionItem.ActionItemExecutionTask.FinalDeadline == _obj.Deadline && actionItem.Deadline.HasValue) { actionItem.Deadline = _obj.Deadline; } // Обновить исполнителя, если он изменен при рестарте. if (actionItem.ActionItemExecutionTask.Assignee != _obj.Assignee && actionItem.Assignee != _obj.Assignee) { actionItem.Assignee = _obj.Assignee; } } if (_obj.ActionItemType == ActionItemType.Additional) { _obj.ActiveText = ActionItemExecutionTasks.Resources.SentToCoAssignee; } // Выдать права на изменение для возможности прекращения задачи. Functions.ActionItemExecutionTask.GrantAccessRightToTask(_obj, _obj); if (_obj.IsDraftResolution == true && !_obj.DocumentsGroup.OfficialDocuments.Any()) { if (ReviewDraftResolutionAssignments.Is(_obj.ParentAssignment)) { _obj.DocumentsGroup.OfficialDocuments.Add(ReviewDraftResolutionAssignments.As(_obj.ParentAssignment).DocumentForReviewGroup.OfficialDocuments.FirstOrDefault()); } else { _obj.DocumentsGroup.OfficialDocuments.Add(PreparingDraftResolutionAssignments.As(_obj.ParentAssignment).DocumentForReviewGroup.OfficialDocuments.FirstOrDefault()); } } }
/// <summary> /// Добавить блок информации о рассмотрении документа руководителем. /// </summary> /// <param name="stateView">Схема представления.</param> /// <param name="startDate">Дата начала текущей итерации рассмотрения.</param> /// <returns>Полученный блок.</returns> private StateBlock AddReviewManagerBlock(StateView stateView, DateTime startDate) { var managerAssignment = this.GetManagerAssignment(startDate); var resolutionAssignment = this.GetPreparingDraftResolutionAssignment(startDate); var author = managerAssignment != null? Docflow.PublicFunctions.OfficialDocument.GetAuthor(managerAssignment.Performer, managerAssignment.CompletedBy) : Docflow.PublicFunctions.OfficialDocument.GetAuthor(_obj.Addressee, _obj.Addressee); var actionItems = ActionItemExecutionTasks.GetAll() .Where(t => (t.ParentAssignment != null && (Equals(t.ParentAssignment.Task, _obj) || Equals(t.ParentAssignment, managerAssignment))) && t.Status != Workflow.Task.Status.Draft && Equals(t.AssignedBy, DocumentReviewTasks.As(_obj).Addressee)) .OrderBy(t => t.Started); var isCompleted = (managerAssignment != null && managerAssignment.Status == Workflow.AssignmentBase.Status.Completed) || (resolutionAssignment != null && resolutionAssignment.Result == RecordManagement.PreparingDraftResolutionAssignment.Result.AddAssignment); var isReworkresolution = managerAssignment != null && ReviewDraftResolutionAssignments.Is(managerAssignment) && managerAssignment.Result == RecordManagement.ReviewDraftResolutionAssignment.Result.AddResolution && !(resolutionAssignment != null && resolutionAssignment.Result == RecordManagement.PreparingDraftResolutionAssignment.Result.AddAssignment); var isDraft = _obj.Status == Workflow.Task.Status.Draft; var headerStyle = Docflow.PublicFunctions.Module.CreateHeaderStyle(isDraft); var performerStyle = Docflow.PublicFunctions.Module.CreatePerformerDeadlineStyle(isDraft); var labelStyle = Docflow.PublicFunctions.Module.CreateStyle(false, isDraft, false); var separatorStyle = Docflow.PublicFunctions.Module.CreateSeparatorStyle(); // Добавить блок. Установить иконку и сущность. var block = stateView.AddBlock(); block.Entity = _obj; if (isCompleted && !isReworkresolution) { block.AssignIcon(ReviewManagerAssignments.Info.Actions.AddResolution, StateBlockIconSize.Large); } else { block.AssignIcon(StateBlockIconType.OfEntity, StateBlockIconSize.Large); } // Рассмотрение руководителем ещё в работе. if (!isCompleted || isReworkresolution) { // Добавить заголовок. block.AddLabel(Docflow.Resources.StateViewDocumentReview, headerStyle); block.AddLineBreak(); if (managerAssignment != null && !isReworkresolution) { if (managerAssignment.Status == Workflow.AssignmentBase.Status.Aborted) { Docflow.PublicFunctions.Module.AddInfoToRightContent(block, Docflow.ApprovalTasks.Resources.StateViewAborted); } else if (managerAssignment.IsRead == false) { Docflow.PublicFunctions.Module.AddInfoToRightContent(block, Docflow.ApprovalTasks.Resources.StateViewUnRead); } else { this.AddAssignmentStatusInfoToRight(block, labelStyle, managerAssignment); } } else if (_obj.Status == Workflow.Task.Status.Completed) { Docflow.PublicFunctions.Module.AddInfoToRightContent(block, Docflow.ApprovalTasks.Resources.StateViewCompleted); } else if (_obj.Status == Workflow.Task.Status.Aborted) { Docflow.PublicFunctions.Module.AddInfoToRightContent(block, Docflow.ApprovalTasks.Resources.StateViewAborted); } // Адресат. block.AddLabel(string.Format("{0}: {1}", Docflow.Resources.StateViewAddressee, Company.PublicFunctions.Employee.GetShortName(_obj.Addressee, false)), performerStyle); var deadline = managerAssignment != null && !isReworkresolution ? managerAssignment.Deadline : _obj.MaxDeadline; var deadlineString = deadline.HasValue ? Docflow.PublicFunctions.Module.ToShortDateShortTime(deadline.Value.ToUserTime()) : Docflow.OfficialDocuments.Resources.StateViewWithoutTerm; block.AddLabel(string.Format("{0}: {1}", Docflow.OfficialDocuments.Resources.StateViewDeadline, deadlineString), performerStyle); if (!isReworkresolution && managerAssignment != null && managerAssignment.Deadline.HasValue) { Docflow.PublicFunctions.OfficialDocument.AddDeadlineHeaderToRight(block, managerAssignment.Deadline.Value, managerAssignment.Performer); } else if (resolutionAssignment != null && resolutionAssignment.Deadline.HasValue) { Docflow.PublicFunctions.OfficialDocument.AddDeadlineHeaderToRight(block, resolutionAssignment.Deadline.Value, resolutionAssignment.Performer); } } else if (managerAssignment != null || resolutionAssignment != null) { // Рассмотрение завершено. // Добавить заголовок. var completionDate = managerAssignment == null?resolutionAssignment.Completed.Value.ToUserTime() : managerAssignment.Completed.Value.ToUserTime(); var resolutionDate = Docflow.PublicFunctions.Module.ToShortDateShortTime(completionDate); block.AddLabel(Docflow.Resources.StateViewResolution, headerStyle); block.AddLineBreak(); block.AddLabel(string.Format("{0}: {1} {2}: {3}", DocumentReviewTasks.Resources.StateViewAuthor, author, Docflow.OfficialDocuments.Resources.StateViewDate, resolutionDate), performerStyle); block.AddLineBreak(); block.AddLabel(Docflow.Constants.Module.SeparatorText, separatorStyle); block.AddLineBreak(); block.AddEmptyLine(Docflow.Constants.Module.EmptyLineMargin); // Если поручения не созданы, или рассмотрение выполнено с результатом "Вынести резолюцию" или "Принято к сведению" и помощник сам не отправлял поручения в работу. // В старых задачах поручение и рассмотрение не связаны, поэтому обрабатываем такие случаи как резолюцию. if (!actionItems.Any() || (managerAssignment != null && managerAssignment.Result != RecordManagement.ReviewManagerAssignment.Result.AddAssignment && managerAssignment.Result != RecordManagement.ReviewDraftResolutionAssignment.Result.ForExecution && !(resolutionAssignment != null && resolutionAssignment.Result == RecordManagement.PreparingDraftResolutionAssignment.Result.AddAssignment))) { var comment = resolutionAssignment != null && resolutionAssignment.Result == RecordManagement.PreparingDraftResolutionAssignment.Result.AddAssignment ? Docflow.PublicFunctions.Module.GetFormatedUserText(resolutionAssignment.Texts.Last().Body) : Docflow.PublicFunctions.Module.GetFormatedUserText(managerAssignment.Texts.Last().Body); block.AddLabel(comment); block.AddLineBreak(); } else { // Добавить информацию по каждому поручению. foreach (var actionItem in actionItems) { if (actionItem.IsCompoundActionItem == true) { foreach (var item in actionItem.ActionItemParts) { if (item.ActionItemPartExecutionTask != null) { Functions.ActionItemExecutionTask.AddActionItemInfo(block, item.ActionItemPartExecutionTask, author); } } } else { Functions.ActionItemExecutionTask.AddActionItemInfo(block, actionItem, author); } } } } return(block); }