Exemplo n.º 1
0
        public Sungero.Core.StateView GetStateView()
        {
            var stateView = StateView.Create();

            // Добавить блок информации к блоку задачи.
            var taskHeader = VerificationTasks.Resources.StateViewTaskBlockHeader;

            this.AddInformationBlock(stateView, taskHeader, _obj.Started.Value);

            // Блок информации о задаче.
            var taskBlock = this.AddTaskBlock(stateView);

            // Получить все задания по задаче.
            var taskAssignments = VerificationAssignments.GetAll(a => Equals(a.Task, _obj)).OrderBy(a => a.Created).ToList();

            // Статус задачи.
            var status = _obj.Info.Properties.Status.GetLocalizedValue(_obj.Status);

            var lastAssignment = taskAssignments.OrderByDescending(a => a.Created).FirstOrDefault();

            if (!string.IsNullOrWhiteSpace(status))
            {
                Docflow.PublicFunctions.Module.AddInfoToRightContent(taskBlock, status);
            }

            // Блоки информации о заданиях.
            foreach (var assignment in taskAssignments)
            {
                var assignmentBlock = this.GetAssignmentBlock(assignment);

                taskBlock.AddChildBlock(assignmentBlock);
            }

            return(stateView);
        }
Exemplo n.º 2
0
        public Sungero.Core.StateView GetStateView()
        {
            var stateView = StateView.Create();

            stateView.AddDefaultLabel(Docflow.OfficialDocuments.Resources.StateViewDefault);

            var minutes            = Minuteses.GetAll(d => Equals(d.Meeting, _obj));
            var documentsGroupGuid = Docflow.PublicConstants.Module.TaskMainGroup.ActionItemExecutionTask;
            var actionItems        = RecordManagement.ActionItemExecutionTasks.GetAll()
                                     .Where(t => t.AttachmentDetails.Any(g => g.GroupId == documentsGroupGuid && minutes.Any(m => m.Id == g.AttachmentId)))
                                     .OrderBy(task => task.Created);

            var statusesCache = new Dictionary <Enumeration?, string>();

            foreach (var actionItem in actionItems)
            {
                if (stateView.Blocks.Any(b => b.HasEntity(actionItem)))
                {
                    continue;
                }

                var stateViewModel = Sungero.RecordManagement.Structures.ActionItemExecutionTask.StateViewModel.Create();
                stateViewModel.StatusesCache = statusesCache;
                var blocks = RecordManagement.PublicFunctions.ActionItemExecutionTask.GetActionItemStateView(actionItem, actionItem, stateViewModel, null, string.Empty,
                                                                                                             null, null, true, false).Blocks;
                statusesCache = stateViewModel.StatusesCache;

                // Убираем первый блок с текстовой информацией по поручению.
                foreach (var block in blocks.Skip(1))
                {
                    stateView.AddBlock(block);
                }
            }
            return(stateView);
        }
Exemplo n.º 3
0
        public Sungero.Core.StateView GetStateView()
        {
            var stateView = StateView.Create();

            var comment = Docflow.PublicFunctions.Module.GetTaskUserComment(_obj, Resources.ConsiderationText);

            if (_obj.Status != Workflow.Task.Status.Aborted)
            {
                if (_obj.Started.HasValue)
                {
                    Docflow.PublicFunctions.OfficialDocument
                    .AddUserActionBlock(stateView, _obj.Author, DocumentReviewTasks.Resources.StateViewDocumentSent, _obj.Started.Value, _obj, comment, _obj.StartedBy);
                }
                else
                {
                    Docflow.PublicFunctions.OfficialDocument
                    .AddUserActionBlock(stateView, _obj.Author, Docflow.ApprovalTasks.Resources.StateViewTaskDrawCreated, _obj.Created.Value, _obj, comment, _obj.Author);
                }
            }

            var startDate    = this.GetIterationStartDate();
            var managerBlock = this.AddReviewManagerBlock(stateView, startDate);

            if (managerBlock != null)
            {
                this.AddPreraringDraftResolutionBlock(managerBlock, startDate);
                this.AddReviewResolutionBlock(managerBlock, startDate);
            }
            return(stateView);
        }
Exemplo n.º 4
0
        public Sungero.Core.StateView GetStateView()
        {
            var stateView           = StateView.Create();
            var skipResolutionBlock = false;

            var statusesCache = new Dictionary <Enumeration?, string>();

            foreach (var task in _obj.ResolutionGroup.ActionItemExecutionTasks)
            {
                var stateViewModel = Structures.ActionItemExecutionTask.StateViewModel.Create();
                stateViewModel.StatusesCache = statusesCache;
                var blocks = PublicFunctions.ActionItemExecutionTask.GetActionItemStateView(task, task, stateViewModel, null, string.Empty, null, null, skipResolutionBlock, false).Blocks;
                statusesCache = stateViewModel.StatusesCache;

                // Убираем первый блок с текстовой информацией по поручению.
                foreach (var block in blocks.Skip(1))
                {
                    stateView.AddBlock(block);
                }

                // Строим блок резолюции только для первого поручения.
                skipResolutionBlock = true;
            }
            return(stateView);
        }
Exemplo n.º 5
0
 /// <summary>
 /// Построить модель контрола состояния документа.
 /// </summary>
 /// <param name="document">Документ.</param>
 /// <returns>Модель контрола состояния.</returns>
 public Sungero.Core.StateView GetStateView(Sungero.Docflow.IOfficialDocument document)
 {
     if (_obj.AllAttachments.Any(d => Equals(document, d)))
     {
         return(this.GetStateView());
     }
     else
     {
         return(StateView.Create());
     }
 }
Exemplo n.º 6
0
 /// <summary>
 /// Построить модель состояния процесса ознакомления.
 /// </summary>
 /// <param name="document">Документ.</param>
 /// <returns>Схема модели состояния.</returns>
 public Sungero.Core.StateView GetStateView(IElectronicDocument document)
 {
     if (_obj.DocumentGroup.OfficialDocuments.Any(d => Equals(document, d)) ||
         _obj.AddendaGroup.OfficialDocuments.Any(d => Equals(document, d)))
     {
         return(this.GetStateView());
     }
     else
     {
         return(StateView.Create());
     }
 }
Exemplo n.º 7
0
        public Sungero.Core.StateView GetStateView()
        {
            var stateView = StateView.Create();

            // Добавить блок информации к блоку задачи.
            var taskHeader = ExchangeDocumentProcessingTasks.Resources.StateViewInformationBlockFormat(ExchangeCore.PublicFunctions.BoxBase.GetExchangeService(_obj.Box));

            this.AddInformationBlock(stateView, taskHeader, _obj.Started.Value);

            // Блок информации о задаче.
            var taskBlock = this.AddTaskBlock(stateView);

            // Получить все задания по задаче.
            var taskAssignments = ExchangeDocumentProcessingAssignments.GetAll(a => Equals(a.Task, _obj)).OrderBy(a => a.Created).ToList();

            // Статус задачи.
            var status = _obj.Info.Properties.Status.GetLocalizedValue(_obj.Status);

            var lastAssignment = taskAssignments.OrderByDescending(a => a.Created).FirstOrDefault();

            // Установить статус отказать, если обработка завершилась с этим результатом.
            if (lastAssignment.Result == Exchange.ExchangeDocumentProcessingAssignment.Result.Abort)
            {
                status = lastAssignment.Info.Properties.Result.GetLocalizedValue(lastAssignment.Result);
            }

            if (!string.IsNullOrWhiteSpace(status))
            {
                Docflow.PublicFunctions.Module.AddInfoToRightContent(taskBlock, status);
            }

            // Блоки информации о заданиях.
            foreach (var assignment in taskAssignments)
            {
                var assignmentBlock = this.GetAssignmentBlock(assignment);

                taskBlock.AddChildBlock(assignmentBlock);
            }

            return(stateView);
        }
Exemplo n.º 8
0
        public StateView GetInstruction()
        {
            var instruction = StateView.Create();
            var block       = instruction.AddBlock();

            block.AddLabel(VerificationAssignments.Resources.InstructionStep1);
            block.AddLineBreak();
            block.AddLabel(VerificationAssignments.Resources.InstructionStep2);
            block.AddLineBreak();
            block.AddLabel(VerificationAssignments.Resources.InstructionStep3);
            block.AddLineBreak();
            block.AddLabel(VerificationAssignments.Resources.InstructionStep4);
            block.AddLineBreak();
            block.AddLabel(VerificationAssignments.Resources.InstructionStep5);
            block.AddLineBreak();
            block.AddLabel(VerificationAssignments.Resources.InstructionStep6);
            block.AddLineBreak();
            block.AddLabel(VerificationAssignments.Resources.InstructionStep7);

            return(instruction);
        }
Exemplo n.º 9
0
        /// <summary>
        /// Сводка по документу.
        /// </summary>
        /// <returns>Сводка.</returns>
        public override StateView GetDocumentSummary()
        {
            var documentSummary = StateView.Create();
            var block           = documentSummary.AddBlock();

            // Краткое имя документа.
            var documentName = _obj.DocumentKind.Name;

            if (!string.IsNullOrWhiteSpace(_obj.RegistrationNumber))
            {
                documentName += Docflow.OfficialDocuments.Resources.Number + _obj.RegistrationNumber;
            }

            if (_obj.RegistrationDate != null)
            {
                documentName += Docflow.OfficialDocuments.Resources.DateFrom + _obj.RegistrationDate.Value.ToString("d");
            }

            block.AddLabel(documentName);
            block.AddLineBreak();
            block.AddEmptyLine();

            // Контрагент.
            block.AddLabel(string.Format("{0}: ", _obj.Info.Properties.Counterparty.LocalizedName));
            if (_obj.Counterparty != null)
            {
                block.AddLabel(Hyperlinks.Get(_obj.Counterparty));
                if (_obj.Counterparty.Nonresident == true)
                {
                    block.AddLabel(string.Format("({0})", _obj.Counterparty.Info.Properties.Nonresident.LocalizedName).ToLower());
                }
            }
            else
            {
                block.AddLabel("-");
            }

            block.AddLineBreak();

            // Содержание.
            var subject = !string.IsNullOrEmpty(_obj.Subject) ? _obj.Subject : "-";

            block.AddLabel(string.Format("{0}: {1}", _obj.Info.Properties.Subject.LocalizedName, subject));
            block.AddLineBreak();

            // Сумма.
            var amount     = this.GetTotalAmountDocumentSummary(_obj.TotalAmount, _obj.Currency);
            var amountText = string.Format("{0}: {1}", _obj.Info.Properties.TotalAmount.LocalizedName, amount);

            block.AddLabel(amountText);
            block.AddLineBreak();

            // Оплатить до.
            var paymentDeadline     = _obj.PaymentDueDate.HasValue ? _obj.PaymentDueDate.Value.ToString("d") : "-";
            var paymentDeadlineText = string.Format("{0}: {1}", _obj.Info.Properties.PaymentDueDate.LocalizedName, paymentDeadline);

            block.AddLabel(paymentDeadlineText);
            block.AddLineBreak();
            block.AddEmptyLine();

            // Примечание.
            var note = !string.IsNullOrEmpty(_obj.Note) ? _obj.Note : "-";

            block.AddLabel(string.Format("{0}: {1}", _obj.Info.Properties.Note.LocalizedName, note));

            return(documentSummary);
        }
Exemplo n.º 10
0
        public Sungero.Core.StateView GetStateView()
        {
            var stateView = StateView.Create();

            // Блок "От кого".
            var taskBeginText = _obj.Texts.OrderByDescending(t => t.Created).FirstOrDefault();
            var comment       = taskBeginText != null ? taskBeginText.Body : string.Empty;

            comment = comment != AcquaintanceTasks.Resources.TaskAutoText ? comment : string.Empty;
            if (_obj.Started.HasValue)
            {
                Docflow.PublicFunctions.OfficialDocument
                .AddUserActionBlock(stateView, _obj.Author, AcquaintanceTasks.Resources.StateViewDocumentSendFromAcquaintance, _obj.Started.Value, _obj, comment, _obj.StartedBy);
            }
            else
            {
                Docflow.PublicFunctions.OfficialDocument
                .AddUserActionBlock(stateView, _obj.Author, Docflow.ApprovalTasks.Resources.StateViewTaskDrawCreated, _obj.Created.Value, _obj, comment, _obj.Author);
            }

            // Блок "Задача".
            var taskBlock = this.AddTaskBlock(stateView);

            // "Ознакомление в электронном виде".
            var assignments = AcquaintanceAssignments.GetAll()
                              .Where(a => Equals(a.Task, _obj))
                              .Where(a => a.Created >= _obj.Started)
                              .ToList();
            var acquaintantedAssignments = assignments
                                           .Where(a => a.Status == Workflow.AssignmentBase.Status.Completed)
                                           .Where(a => Equals(a.CompletedBy, a.Performer))
                                           .ToList();
            var attentionAssignments = assignments
                                       .Where(a => a.Status == Workflow.AssignmentBase.Status.Completed)
                                       .Where(a => !Equals(a.CompletedBy, a.Performer))
                                       .ToList();

            // "Ознакомление под собственноручную подпись".
            var isElectronicAcquaintance = _obj.IsElectronicAcquaintance == true;

            if (!isElectronicAcquaintance)
            {
                // Задания выполненные не лично считаются также ознакомленными.
                acquaintantedAssignments = assignments
                                           .Where(a => a.Status == Workflow.AssignmentBase.Status.Completed)
                                           .ToList();

                // Заданий требующих внимания нет.
                attentionAssignments = new List <IAcquaintanceAssignment>();
            }

            // Блок "Ознакомленные".
            if (acquaintantedAssignments.Count > 1)
            {
                this.AddSelfCompletedAssignmentsBlocks(taskBlock, acquaintantedAssignments, isElectronicAcquaintance);
            }
            else
            {
                this.AddAssignmentBlock(taskBlock,
                                        acquaintantedAssignments.FirstOrDefault(),
                                        isElectronicAcquaintance,
                                        StateBlockIconSize.Large,
                                        AcquaintanceTasks.Resources.StateViewAsquaintance);
            }

            // Блок "Задания требующие внимания".
            foreach (var assignment in attentionAssignments)
            {
                this.AddAssignmentBlock(taskBlock,
                                        assignment,
                                        isElectronicAcquaintance,
                                        StateBlockIconSize.Large,
                                        AcquaintanceTasks.Resources.StateViewAsquaintance);
            }

            // Блок "Задания в работе".
            var inProcessAssignments = assignments
                                       .Where(a => a.Status != Workflow.AssignmentBase.Status.Completed)
                                       .ToList();

            this.AddInProcessAssignmentsBlock(taskBlock, inProcessAssignments);

            // Блок "Задание-контроль".
            var finishAssignments = AcquaintanceFinishAssignments.GetAll()
                                    .Where(a => Equals(a.Task, _obj))
                                    .Where(a => a.Created >= _obj.Started)
                                    .ToList();

            foreach (var assignment in finishAssignments)
            {
                this.AddAssignmentBlock(taskBlock,
                                        assignment,
                                        isElectronicAcquaintance,
                                        StateBlockIconSize.Large,
                                        AcquaintanceTasks.Resources.StateViewFinishAssignment);
            }

            return(stateView);
        }
Exemplo n.º 11
0
        /// <summary>
        /// Добавить блок задания на обработку входящих документов из сервиса обмена.
        /// </summary>
        /// <param name="assignment">Задание.</param>
        /// <returns>Новый блок.</returns>
        public Sungero.Core.StateBlock GetAssignmentBlock(IAssignment assignment)
        {
            // Стили.
            var performerDeadlineStyle = Docflow.PublicFunctions.Module.CreatePerformerDeadlineStyle();
            var boldStyle      = Docflow.PublicFunctions.Module.CreateStyle(true, false);
            var grayStyle      = Docflow.PublicFunctions.Module.CreateStyle(false, true);
            var separatorStyle = Docflow.PublicFunctions.Module.CreateSeparatorStyle();
            var noteStyle      = Docflow.PublicFunctions.Module.CreateNoteStyle();

            var block = StateView.Create().AddBlock();

            block.Entity = assignment;

            // Иконка.
            this.SetIcon(block, ExchangeDocumentProcessingAssignments.As(assignment));

            // Заголовок.
            block.AddLabel(ExchangeDocumentProcessingTasks.Resources.StateViewAssignmentBlockHeader, boldStyle);
            block.AddLineBreak();

            // Кому.
            var assigneeShortName = Company.PublicFunctions.Employee.GetShortName(Company.Employees.As(assignment.Performer), false);
            var performerInfo     = string.Format("{0}: {1}", Docflow.OfficialDocuments.Resources.StateViewTo, assigneeShortName);

            block.AddLabel(performerInfo, performerDeadlineStyle);

            // Срок.
            if (assignment.Deadline.HasValue)
            {
                var deadlineLabel = Docflow.PublicFunctions.Module.ToShortDateShortTime(assignment.Deadline.Value.ToUserTime());
                block.AddLabel(string.Format("{0}: {1}", Docflow.OfficialDocuments.Resources.StateViewDeadline, deadlineLabel), performerDeadlineStyle);
            }

            // Текст задания.
            var comment = Docflow.PublicFunctions.Module.GetAssignmentUserComment(Assignments.As(assignment));

            if (!string.IsNullOrWhiteSpace(comment))
            {
                // Разделитель.
                block.AddLineBreak();
                block.AddLabel(Docflow.PublicFunctions.Module.GetSeparatorText(), separatorStyle);
                block.AddLineBreak();
                block.AddEmptyLine(Docflow.PublicFunctions.Module.GetEmptyLineMargin());

                block.AddLabel(comment, noteStyle);
            }

            // Статус.
            var status = AssignmentBases.Info.Properties.Status.GetLocalizedValue(assignment.Status);

            // Для непрочитанных заданий указать это.
            if (assignment.IsRead == false)
            {
                status = Docflow.ApprovalTasks.Resources.StateViewUnRead.ToString();
            }

            // Для исполненных заданий указать результат, с которым они исполнены, кроме "Обработано".
            if (assignment.Status == Workflow.AssignmentBase.Status.Completed &&
                assignment.Result != Exchange.ExchangeDocumentProcessingAssignment.Result.Complete)
            {
                status = Exchange.ExchangeDocumentProcessingAssignments.Info.Properties.Result.GetLocalizedValue(assignment.Result);
            }

            if (!string.IsNullOrWhiteSpace(status))
            {
                Docflow.PublicFunctions.Module.AddInfoToRightContent(block, status);
            }

            // Задержка исполнения.
            if (assignment.Deadline.HasValue &&
                assignment.Status == Workflow.AssignmentBase.Status.InProcess)
            {
                Docflow.PublicFunctions.OfficialDocument.AddDeadlineHeaderToRight(block, assignment.Deadline.Value, assignment.Performer);
            }

            return(block);
        }
        public override StateView GetDocumentSummary()
        {
            var documentSummary = StateView.Create();
            var documentBlock   = documentSummary.AddBlock();

            // Краткое имя документа.
            var documentName = _obj.DocumentKind.Name;

            if (!string.IsNullOrWhiteSpace(_obj.RegistrationNumber))
            {
                documentName += Docflow.OfficialDocuments.Resources.Number + _obj.RegistrationNumber;
            }

            if (_obj.RegistrationDate != null)
            {
                documentName += Docflow.OfficialDocuments.Resources.DateFrom + _obj.RegistrationDate.Value.ToString("d");
            }

            documentBlock.AddLabel(documentName);

            // Типовой/Не типовой.
            var isStandardLabel = _obj.IsStandard.Value ? ContractBases.Resources.isStandartContract : ContractBases.Resources.isNotStandartContract;

            documentBlock.AddLabel(string.Format("({0})", isStandardLabel));
            documentBlock.AddLineBreak();
            documentBlock.AddLineBreak();

            // Контрагент.
            documentBlock.AddLabel(string.Format("{0}:", ContractBases.Resources.Counterparty));
            if (_obj.Counterparty != null)
            {
                documentBlock.AddLabel(Hyperlinks.Get(_obj.Counterparty));
                if (_obj.Counterparty.Nonresident == true)
                {
                    documentBlock.AddLabel(string.Format("({0})", _obj.Counterparty.Info.Properties.Nonresident.LocalizedName).ToLower());
                }
            }
            else
            {
                documentBlock.AddLabel("-");
            }

            documentBlock.AddLineBreak();

            // Содержание.
            var subject = !string.IsNullOrEmpty(_obj.Subject) ? _obj.Subject : "-";

            documentBlock.AddLabel(string.Format("{0}: {1}", ContractBases.Resources.Subject, subject));
            documentBlock.AddLineBreak();

            // Сумма договора.
            var amount     = this.GetTotalAmountDocumentSummary(_obj.TotalAmount, _obj.Currency);
            var amountText = string.Format("{0}: {1}", _obj.Info.Properties.TotalAmount.LocalizedName, amount);

            documentBlock.AddLabel(amountText);
            documentBlock.AddLineBreak();

            // Срок действия договора.
            var validity  = "-";
            var validFrom = _obj.ValidFrom.HasValue ?
                            string.Format("{0} {1} ", ContractBases.Resources.From, _obj.ValidFrom.Value.Date.ToShortDateString()) :
                            string.Empty;

            var validTill = _obj.ValidTill.HasValue ?
                            string.Format("{0} {1}", ContractBases.Resources.Till, _obj.ValidTill.Value.Date.ToShortDateString()) :
                            string.Empty;

            var isAutomaticRenewal = _obj.IsAutomaticRenewal.Value && !string.IsNullOrEmpty(validTill) ?
                                     string.Format(", {0}", ContractBases.Resources.Renewal) :
                                     string.Empty;

            if (!string.IsNullOrEmpty(validFrom) || !string.IsNullOrEmpty(validTill))
            {
                validity = string.Format("{0}{1}{2}", validFrom, validTill, isAutomaticRenewal);
            }

            var validityText = string.Format("{0}:", ContractBases.Resources.Validity);

            documentBlock.AddLabel(validityText);
            documentBlock.AddLabel(validity);
            documentBlock.AddLineBreak();
            documentBlock.AddEmptyLine();

            // Примечание.
            var note     = string.IsNullOrEmpty(_obj.Note) ? "-" : _obj.Note;
            var noteText = string.Format("{0}:", ContractBases.Resources.Note);

            documentBlock.AddLabel(noteText);
            documentBlock.AddLabel(note);

            return(documentSummary);
        }
Exemplo n.º 13
0
        public Sungero.Core.StateView GetStateView()
        {
            // Добавить заголовок.
            var stateView = StateView.Create();

            var taskBeginText = _obj.Texts.OrderBy(t => t.Created).FirstOrDefault();
            var comment       = taskBeginText != null ? taskBeginText.Body : string.Empty;

            comment = comment != FreeApprovalTasks.Resources.ApprovalText ? comment : string.Empty;
            if (_obj.Started.HasValue)
            {
                Docflow.PublicFunctions.OfficialDocument
                .AddUserActionBlock(stateView, _obj.Author, ApprovalTasks.Resources.StateViewDocumentSentForApproval, _obj.Started.Value, _obj, comment, _obj.StartedBy);
            }
            else
            {
                Docflow.PublicFunctions.OfficialDocument
                .AddUserActionBlock(stateView, _obj.Author, ApprovalTasks.Resources.StateViewTaskDrawCreated, _obj.Created.Value, _obj, comment, _obj.Author);
            }

            // Добавить основной блок для задачи.
            var taskBlock = this.AddTaskBlock(stateView);

            // Получить все задания по задаче.
            var taskAssignments = Assignments.GetAll().Where(a => Equals(a.Task, _obj)).ToList();

            // Определить итерации.
            var iterations = Functions.Module.GetIterationDates(_obj);

            // Обработать каждую итерацию.
            foreach (var iteration in iterations)
            {
                var date             = iteration.Date;
                var hasReworkBefore  = iteration.IsRework;
                var hasRestartBefore = iteration.IsRestart;

                var nextIteration = iterations.Where(d => d.Date > date).FirstOrDefault();
                var nextDate      = Calendar.Now;

                if (nextIteration != null)
                {
                    nextDate = nextIteration.Date;
                }

                // Получить задания в рамках круга согласования.
                var assignments = taskAssignments
                                  .Where(a => a.Created >= date && a.Created < nextDate)
                                  .OrderBy(a => a.Created)
                                  .ToList();

                // Если нет заданий, то перейти к следующей итерации.
                if (!assignments.Any())
                {
                    continue;
                }

                // Добавить блок отправки.
                this.AddSendForApprovalBlock(taskBlock, assignments.First(), hasReworkBefore, hasRestartBefore);

                StateBlock parentBlock = null;

                // Выделить этап согласования.
                var approvalAssignments = assignments.Where(a => FreeApprovalAssignments.Is(a));
                if (approvalAssignments.Any())
                {
                    // Вставить блок для группировки этапа согласования.
                    var iterationBlock = taskBlock.AddChildBlock();
                    iterationBlock.NeedGroupChildren = true;
                    iterationBlock.IsExpanded        = approvalAssignments.Any(a => a.Status == Workflow.AssignmentBase.Status.InProcess);

                    // Заголовок блока итерации.
                    iterationBlock.AddLabel(ApprovalTasks.Resources.StateViewApprovalStage, Docflow.PublicFunctions.Module.CreateHeaderStyle());
                    iterationBlock.AddLineBreak();

                    // Добавить информацию по исполнителям группы согласования.
                    var performersLabel = string.Join(", ", approvalAssignments
                                                      .Select(a => a.Performer)
                                                      .Distinct()
                                                      .Select(a => (Sungero.Company.Employees.Is(a) ?
                                                                    Company.PublicFunctions.Employee.GetShortName(Sungero.Company.Employees.As(a), false) :
                                                                    a.Name)));
                    iterationBlock.AddLabel(performersLabel, Docflow.PublicFunctions.Module.CreatePerformerDeadlineStyle());

                    parentBlock = iterationBlock;
                }

                // Добавить задания.
                assignments = assignments.OrderByDescending(a => a.Result.HasValue).ThenBy(a => a.Completed).ToList();
                this.AddAssignmentsBlocks(parentBlock, taskBlock, assignments);

                // Установить иконку и статус для группировки этапа согласования.
                var endStatus = string.Empty;
                if (parentBlock != null)
                {
                    // Иконка по умолчанию.
                    parentBlock.AssignIcon(FreeApprovalTasks.Resources.FreeApproveStage, StateBlockIconSize.Large);

                    if (approvalAssignments.Any(a => a.Result == Docflow.FreeApprovalAssignment.Result.ForRework))
                    {
                        parentBlock.AssignIcon(ApprovalTasks.Resources.Notapprove, StateBlockIconSize.Large);
                        endStatus = ApprovalTasks.Resources.StateViewNotApproved;
                    }
                    else if (!approvalAssignments.Any(a => a.Result != Docflow.FreeApprovalAssignment.Result.Approved))
                    {
                        parentBlock.AssignIcon(ApprovalTasks.Resources.Approve, StateBlockIconSize.Large);
                        endStatus = ApprovalTasks.Resources.StateViewEndorsed;
                    }

                    if (assignments.Any(a => a.Status == Workflow.AssignmentBase.Status.Aborted))
                    {
                        parentBlock.AssignIcon(StateBlockIconType.Abort, StateBlockIconSize.Large);
                        endStatus = ApprovalTasks.Resources.StateViewAborted;
                    }

                    Functions.Module.AddInfoToRightContent(parentBlock, parentBlock.IsExpanded ? ApprovalTasks.Resources.StateViewInProcess : endStatus);
                }
            }

            return(stateView);
        }
        public static Sungero.Core.StateBlock GetAssignmentBlock(IAssignmentBase assignment)
        {
            // Стили.
            var headerStyle            = Docflow.PublicFunctions.Module.CreateHeaderStyle();
            var performerDeadlineStyle = Docflow.PublicFunctions.Module.CreatePerformerDeadlineStyle();
            // var boldStyle = Docflow.PublicFunctions.Module.CreateStyle(true, false);
            var grayStyle      = Docflow.PublicFunctions.Module.CreateStyle(false, true);
            var separatorStyle = Docflow.PublicFunctions.Module.CreateSeparatorStyle();

            var block = StateView.Create().AddBlock();

            block.Entity = assignment;

            // Заголовок.
            block.AddLabel("Обработка входящего документа", headerStyle);
            block.AddLineBreak();

            // Кому.
            var assigneShortName = Company.PublicFunctions.Employee.GetShortName(Company.Employees.As(assignment.Performer), false);
            var performerInfo    = string.Format("{0}: {1}", Docflow.OfficialDocuments.Resources.StateViewTo, assigneShortName);

            block.AddLabel(performerInfo, performerDeadlineStyle);

            // Срок.
            if (assignment.Deadline.HasValue)
            {
                var deadlineLabel = Docflow.PublicFunctions.Module.ToShortDateShortTime(assignment.Deadline.Value.ToUserTime());
                block.AddLabel(string.Format("{0}: {1}", Docflow.OfficialDocuments.Resources.StateViewDeadline, deadlineLabel), performerDeadlineStyle);
            }

            // Разделитель.
            block.AddLineBreak();
            block.AddLabel(Docflow.Constants.Module.SeparatorText, separatorStyle);
            block.AddLineBreak();
            block.AddEmptyLine(Docflow.Constants.Module.EmptyLineMargin);

            // Текст задания.
            block.AddLabel(Docflow.PublicFunctions.Module.GetFormatedUserText(assignment.ActiveText), grayStyle);

            // Статус.
            var status = AssignmentBases.Info.Properties.Status.GetLocalizedValue(assignment.Status);

            // Для непрочитанных заданий указать это.
            if (assignment.IsRead == false)
            {
                status = Docflow.ApprovalTasks.Resources.StateViewUnRead.ToString();
            }

            if (!string.IsNullOrWhiteSpace(status))
            {
                Docflow.PublicFunctions.Module.AddInfoToRightContent(block, status);
            }

            // Задержка исполнения.
            if (assignment.Deadline.HasValue &&
                (assignment.Status == Workflow.AssignmentBase.Status.InProcess ||
                 assignment.Status == Workflow.AssignmentBase.Status.Completed))
            {
                Docflow.PublicFunctions.OfficialDocument.AddDeadlineHeaderToRight(block, assignment.Deadline.Value, assignment.Performer);
            }

            return(block);
        }
Exemplo n.º 15
0
        public static StateView CreateApprovalListStateView(IOfficialDocument document)
        {
            // Задать текст по умолчанию.
            var stateView = StateView.Create();

            stateView.AddDefaultLabel(OfficialDocuments.Resources.DocumentIsNotSigned);

            if (document == null)
            {
                return(stateView);
            }

            // Сформировать список подписей.
            var filteredSignatures    = new List <Structures.ApprovalReviewAssignment.SignaturesInfo>();
            var signatures            = new List <Structures.ApprovalReviewAssignment.DocumentSignature>();
            var signatureList         = new List <Domain.Shared.ISignature>();
            var externalSignatures    = new List <Structures.ApprovalReviewAssignment.DocumentSignature>();
            var externalSignatureList = new List <Domain.Shared.ISignature>();

            foreach (var version in document.Versions.OrderByDescending(v => v.Created))
            {
                // Получить к версии Согласующие и Утверждающие подписи в порядке подписывания.
                var versionSignatures = Signatures.Get(version).Where(s => s.SignatureType != SignatureType.NotEndorsing).OrderByDescending(s => s.SigningDate);

                // Вывести информацию о подписях.
                foreach (var signature in versionSignatures)
                {
                    if (signature.IsExternal == true)
                    {
                        externalSignatures.Add(Structures.ApprovalReviewAssignment.DocumentSignature.Create(signature.Id, signature.SigningDate, version.Number));
                        externalSignatureList.Add(signature);
                        continue;
                    }
                    var signatureTypeString = signature.SignatureType == SignatureType.Approval ?
                                              Constants.ApprovalReviewAssignment.ApprovalSignatureType :
                                              Constants.ApprovalReviewAssignment.EndorsingSignatureType;

                    if (!filteredSignatures.Where(f => Equals(f.Signatory, signature.Signatory) && Equals(f.SubstitutedUser, signature.SubstitutedUser) && Equals(f.SignatoryType, signatureTypeString)).Any())
                    {
                        filteredSignatures.Add(Structures.ApprovalReviewAssignment.SignaturesInfo.Create(signature.Signatory, signature.SubstitutedUser, signatureTypeString));
                        signatures.Add(Structures.ApprovalReviewAssignment.DocumentSignature.Create(signature.Id, signature.SigningDate, version.Number));
                        signatureList.Add(signature);
                    }
                }
            }

            // Проверить, что подписи есть.
            if (!signatures.Any())
            {
                return(stateView);
            }

            // Добавить подписи: по убыванию даты подписи, без учета версии.
            foreach (var signatureInfo in signatures.OrderBy(s => s.SigningDate))
            {
                var signingBlock = stateView.AddBlock();
                if (externalSignatures.Any() &&
                    signatureInfo.Equals(signatures.OrderBy(s => s.SigningDate).Last()))
                {
                    signingBlock.DockType = DockType.None;
                }
                else
                {
                    signingBlock.DockType = DockType.Bottom;
                }
                var signature     = signatureList.Single(s => s.Id == signatureInfo.SignatureId);
                var versionNumber = signatureInfo.VersionNumber;
                AddSignatureInfoToBlock(signingBlock, signature, versionNumber);
            }

            if (externalSignatures.Any())
            {
                // Добавить информацию о внешних подписях.
                foreach (var signatureInfo in externalSignatures.OrderBy(s => s.SigningDate))
                {
                    var signingBlock  = stateView.AddBlock();
                    var signature     = externalSignatureList.Single(s => s.Id == signatureInfo.SignatureId);
                    var versionNumber = signatureInfo.VersionNumber;
                    AddExternalSignatureInfoToBlock(signingBlock, signature, versionNumber, document);
                    signingBlock.DockType = DockType.Bottom;
                }
            }

            return(stateView);
        }