DirectumRX Development Studio. Расширение возможностей регламентов согласования

Опубликовано:
30 января в 10:55
  • 0

В новой версии в составе DirectumRX появилась среда разработки – Development Studio, которая позволяет развивать систему под потребности компании, если возможностей настройки недостаточно.

Одной из наиболее частых задач внедрения является доработка задачи по согласованию документов. Данная адаптация включает в себя разработку перекрытий задач и заданий по согласованию.

В разделе базы знаний можно ознакомиться со статьей Рекомендации по разработке перекрытий стандартной прикладной разработки. В этой статье я приведу конкретные кейсы и примеры программного кода по адаптации заданий на согласование.

Роль согласования с несколькими участниками

Как создавать роль согласования с одним участником, описано в справке. Дополню этот пример ситуацией, когда необходимо согласовать документ с несколькими сотрудниками. Например, договор на закупку нужно согласовать с ответственными по направлениям, по которым проводится закупка.

Создадим роль согласования как описано в разделе справки Добавление роли согласования, на шаге по вычислению сотрудника вместо перекрытия GetRolePerformer() реализуем новый метод GetRolePerformers() в серверных функциях справочника, созданного для новой роли (PurchaseApprovalRole):

/// <summary>
/// Получить список исполнителей из роли.
/// </summary>
/// <param name="task">Задача.</param>
/// <returns>Список исполнителей.</returns>
[Remote(IsPure = true), Public]
public List<Sungero.CoreEntities.IRecipient> GetRolePerformers(Sungero.Docflow.IApprovalTask task)
{
  var result = new List<Sungero.CoreEntities.IRecipient>();
  var document = task.DocumentGroup.OfficialDocuments.FirstOrDefault();
  var contract = Trade.Contracts.As(document);
  if (contract != null && _obj.Type == Purchases.PurchaseApprovalRole.Type.Experts)
  {
    foreach (var item in contract.Experts.Where(x => x.Expert != null))
      result.Add(item.Expert);
  }
  return result;
}

Переопределим логику серверной функции GetStageRecipients() из модуля Sungero.Docflow базового решения DirectumRX, данная функция вызывается при вычислениях исполнителей в обработчиках событий блоков схемы задачи и построении предметного отображения на закладке «Задачи» карточки документа. В серверных функциях перекрытого справочника ApprovalStage вызовем метод GetRolePerformers(), написанный на прошлом шаге.

/// <summary>
/// Получить исполнителей этапа без раскрытия групп и ролей.
/// </summary>
/// <param name="task">Задача.</param>
/// <param name="additionalApprovers">Доп.согласующие.</param>
/// <returns>Исполнители.</returns>
[Remote(IsPure = true), Public]
public override List<IRecipient> GetStageRecipients(Sungero.Docflow.IApprovalTask task,
List<IRecipient> additionalApprovers)
{
  var recipients = base.GetStageRecipients(task, additionalApprovers);
      
  var role = _obj.ApprovalRoles
        .Where(x => x.ApprovalRole.Type == Purchases.PurchaseApprovalRole.Type.Experts)
        .Select(x => Purchases.PurchaseApprovalRole.As(x.ApprovalRole)).Where(x => x != null);
      
  if (role != null)
  {       
    recipients.AddRange(Trade.Purchases.PublicFunctions.PurchaseApprovalRole.Remote.
      GetRolePerformers(role, task));
  }      
  return recipients;
}

Реализацию логики по ограничению доступности роли согласования и ее инициализации необходимо выполнить аналогично роли с одним участником.

Предупреждение в задании на согласование

Рассмотрим ситуацию, когда в задании на согласование необходимо проинформировать согласующего о тех или иных ограничениях.

Например, для сотрудника задан лимит полномочий, т.е. он может согласовывать документы только с суммой меньшей 1 млн. руб., а для согласования документов на большую сумму ему необходимо запросить подтверждение у вышестоящей организации.

Чтобы на этапе согласования происходила данная проверка, в карточку этапа с типом «Согласование» добавим новое логическое свойство Проверка полномочий. Для этого необходимо перекрыть справочник Sungero.Docflow.ApprovalStage.

Примечание. Для заполнения свойства Проверка полномочий в уже созданных этапах можно написать конвертер. Подробнее в статье Рекомендации по разработке скриптов конвертации.

Далее перекрываем задание Sungero.Docflow.ApprovalAssignment и в событии Показ формы реализуем проверку c выводом информационного сообщения, если задание было сформировано по этапу, в котором указан признак Проверка полномочий.

var stage = ApprovalStages.As(_obj.Stage);
if (stage != null && stage.IsCheckAuthority == true)
{
 // Проверить полномочия текущего сотрудника.       
  var str = Purchase.PublicFunctions.GetInfoAboutAuthority(Sungero.Company.Employees.Current, 
    _obj.DocumentGroup.OfficialDocuments.FirstOrDefault());
 // Вывести предупреждение.
  if (!string.IsNullOrEmpty(str))
    e.AddInformation(Purchase.Resources.CheckAuthorityFormat(str));
}

Так это будет выглядеть в задании сотруднику:

Если проверку необходимо реализовать на этапе согласования с руководителем, то необходимо перекрывать задание Sungero.Docflow.ApprovalManagerAssignment.

Фиксация информации о согласовании с превышением лимита в тексте задания

В продолжении к прошлому пункту зафиксируем в тексте задания, что оно было выполнено с превышением полномочий, для того, чтобы контролер смог проверить данную информацию при необходимости.

Для этого в перекрытии задания Sungero.Docflow.ApprovalAssignment в событии До выполнения в аргумент e.Result допишем эту информацию:

if (_obj.Result == Result.Approved)
{
  var stage = ApprovalStages.As(_obj.Stage);
  if (stage != null && stage.IsCheckAuthority == true)
  {
    var str = Purchase.PublicFunctions.GetInfoAboutAuthority(Sungero.Company.Employees.Current, 
      _obj.DocumentGroup.OfficialDocuments.FirstOrDefault());
    if (!string.IsNullOrEmpty(str))
      e.Result = Purchase.Resources.CheckAuthorityAssignmentFormat(e.Result, str);
  }
}

Пример того, как в таком случае будет выглядеть переписка по задаче:

В тексте задания могут быть зафиксированы любые другие необходимые в дальнейшем данные.

Голосование в процессе согласования

В завершении расскажу, как можно реализовать возможность голосования в рамках согласования документа.

Рассмотрим пример: на последнем этапе согласования документов по тендеру среди участников тендерного комитета проводится открытое голосование по предложенному поставщику.

Для реализации данного кейса добавим новое свойство Голосование в карточку этапа с типом «Задание».

После этого в карточку задания добавим свойство для голосования, которое должно отображаться только в ситуации, если задание сформировано по этапу с выбранным признаком Голосование.

Для этого перекроем задание Sungero.Docflow.ApprovalSimpleAssignment и добавим свойство Vote с типом перечисление.

После выполнения задания данного типа необходимо записать результат голосования в карточку документа. Это можно реализовать в обработчике блока Выполнение задания в перекрытии Sungero.Docflow. ApprovalTask. Описание вычислений по модификации свойств прорабатываются в курсе по обучению разработки DirectumRX, останавливаться подробно здесь не буду.

Средства настройки регламентов в DirectumRX предоставляют широкие возможности для автоматизации процессов согласования документов. Если этих инструментов недостаточно для Вашей задачи, то можно выполнить точечные перекрытия с малой трудоемкостью.

В дальнейшем планируем писать еще статьи, посвященные темам «Как это сделать?». Поделитесь в комментариях, с какими еще ситуациями вы сталкивались или какие еще рекомендации вы бы хотели видеть на DIRECTUM Club. Пожелания к формату статей тоже прошу писать в комментариях.

23
Подписаться

Комментарии

Пока комментариев нет
Авторизуйтесь, чтобы написать комментарий