Как добавить роль согласования с несколькими участниками
<< Click to Display Table of Contents >> Разработка > Примеры разработки > Согласование по регламенту Как добавить роль согласования с несколькими участниками |
Ситуация
Предположим, договор на закупку нужно согласовать с ответственными по направлениям, по которым проводится приобретение товаров. Например, договор на закупку мониторов дополнительно согласуется с руководителем отдела ИТ. В результате сотрудников, согласующих документ, будет несколько, поэтому требуется добавить роль согласования со списком участников.
Роли согласования предназначены для вычисления исполнителей заданий, которые формируются при согласовании документа по регламенту. Используются для настройки этапов согласования.
Решение
В системе роль согласования – это справочник, записи которого доступны для выбора в этапах согласования. Роль согласования с несколькими участниками создается по аналогии с созданием роли с одним сотрудником, но есть свои отличия.
Вычисление сотрудников для роли «Ответственные»
1.В своем решении, например PurchasesSolution, создайте модуль «Закупки» (Purchases).
2.Чтобы добавить тип роли Ответственные, cоздайте в модуле Purchases тип справочника «Роль «Ответственные». В качестве базового типа сущности для него укажите тип Sungero.Docflow.ApprovalRoleBase. В поле Имя типа сущности укажите PurchaseApprovalRole.
3.Откройте редактор созданного типа справочника:
•измените именование типа справочника. Для локализации отображаемых имен перейдите по ссылке Локализовать;
•проверьте, что в параметрах снят флажок Отображать в проводнике.
4.Перейдите в узел «Свойства» и для свойства-перечисления Type добавьте значение перечисления Experts (Ответственные).
5.В своем решении перекройте тип договора Sungero.Contracts.Contract. Проверьте, что в списке зависимостей вашего решения указан модуль Sungero.Contracts. Если в решении не указаны зависимости от перекрытых модулей, то при публикации могут возникнуть ошибки.
6.Добавьте в договор список ответственных. Для этого перейдите в узел «Свойства» и добавьте в нем свойство-коллекцию Experts. Затем в коллекцию добавьте свойство-ссылку Expert. В поле *Тип сущности укажите Sungero.Company.Employee.
7.Добавьте контрол на форму перекрытого типа договора, в качестве связанного свойства укажите новое свойство-коллекцию Experts.
8.Чтобы при согласовании документов для новой роли вычислялись ответственные, заполненные в карточке договора, переопределите функцию GetRolePerformers(). Для этого в серверных функциях созданного типа справочника PurchaseApprovalRole напишите код:
// Получить список исполнителей из роли.
// <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 = PurchasesSolution.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;
}
9.Чтобы правильно определялись исполнители этапа согласования с ответственными за направление закупок, перекройте справочник Sungero.Docflow.ApprovalStage. Проверьте, что в списке зависимостей вашего решения указан модуль Sungero.Docflow.
10.Переопределите логику серверной функции GetStageRecipients() справочника ApprovalStage. Функция вызывается при вычислениях исполнителей в обработчиках событий блоков схемы задачи и построении отображения на закладке «Задачи» карточки документа. Для этого в серверных функциях перекрытого типа справочника ApprovalStage напишите код:
// Получить исполнителей этапа без раскрытия групп и ролей.
// <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.PurchaseApprovalRoles.As(x.ApprovalRole))
.Where(x => x != null).SingleOrDefault();
if (role!= null)
{
recipients.AddRange(Trade.Purchases.PublicFunctions.PurchaseApprovalRole.Remote.GetRolePerformers(role, task));
}
return recipients;
}
Важно. В примере кода замените Trade на ваш <Код компании>.
11.Сохраните изменения и опубликуйте разработку. Далее инициализируйте роль и ограничьте ее доступность аналогично роли с одним участником.
Примечание. В примере сотрудники из карточки договора, которые включаются в список участников роли «Ответственные», не отображаются в поле Обязательные при создании задачи на согласование по регламенту. При этом, если перейти в задаче на закладку «Регламент», то на схеме будут отображаться все исполнители. Чтобы все исполнители отображались и в карточке задачи, необходимо в программном коде дописать логику добавления их в поле Обязательные.
© Компания Directum, 2024 |