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