<< Click to Display Table of Contents >> Разработка > Примеры разработки > Разработка модуля и типа документа Шаг 6. Добавление роли согласования |
Теперь рассмотрим, как создать роль согласования «Инициатор закупки».
Роль согласования – справочник системы, записи которого доступны для выбора в этапах согласования. При создании роли необходимо:
•добавить в системный справочник новый тип роли «Инициатор закупки»;
•добавить логику вычисления сотрудника для роли «Инициатор закупки»;
•создать роль «Инициатор закупки» в справочнике;
•указать, для каких типов этапов согласования доступна роль;
•добавить проверку того, что роль в правиле согласования используется только с определенными видами документов.
важно. Создание правил согласования доступно только для тех видов документов, для которых разрешена отправка на согласование по регламенту: в карточке вида документа в поле Действия по отправке указано значение Согласование по регламенту.
Вычисление сотрудника для роли «Инициатор закупки»
1.Чтобы добавить в системный справочник новый тип роли «Инициатор закупки», создайте справочник «Роль инициатор закупки». Имя типа справочника – PurchaseApprovalRole, в качестве базового типа сущности укажите тип Sungero.Docflow.ApprovalRoleBase. Проверьте, что в параметрах типа справочника снят флажок Отображать в проводнике.
2.В редакторе созданного типа справочника перейдите в узел «Свойства» и для свойства-перечисления Type добавьте значение перечисления PurchInitiator (Инициатор закупки).
3.Чтобы в процессе согласования документов для роли вычислялся инициатор закупки, переопределите логику функции GetRolePerformer() из модуля Sungero.Docflow базового решения Directum RX. Для этого в серверных функциях созданного справочника (PurchaseApprovalRole) напишите код:
public override Sungero.Company.IEmployee GetRolePerformer(Sungero.Docflow.IApprovalTask task)
{
if (_obj.Type == Trade.Purchases.PurchaseApprovalRole.Type.PurchInitiator)
{
var document = task.DocumentGroup.OfficialDocuments.FirstOrDefault();
var purchaseContract = PurchaseContracts.As(document);
if (purchaseContract != null)
return purchaseContract.Purchase.Initiator;
return null;
}
return base.GetRolePerformer(task);
}
Важно. Замените в коде Trade.Purchases на <Ваш код компании>. Purchases.
4.Так как в программном коде вы переопределили функцию модуля Sungero.Docflow, проверьте, что данный модуль указан в списке зависимостей вашего модуля. При необходимости добавьте его. Если зависимости не указаны, при публикации могут возникнуть ошибки.
Создание роли
Роль согласования – служебный справочник, его записи нельзя создать в клиентском приложении. Чтобы создать роль:
1.В редакторе модуля «Закупки» перейдите по ссылке Добавить рядом с функциями инициализации. Измените имя Function1() на CreateApprovalRole() и напишите программный код для создания роли:
/// <summary>
/// Создание роли.
/// </summary>
public static void CreateApprovalRole(Enumeration roleType, string description)
{
var role = PurchaseApprovalRoles.GetAll().Where(r => Equals(r.Type, roleType)).FirstOrDefault();
// Проверяет наличие роли.
if (role == null)
{
role = PurchaseApprovalRoles.Create();
role.Type = roleType;
}
role.Description = description;
role.Save();
InitializationLogger.Debug("Создана роль 'Инициатор закупки'");
}
2.В узле «Модуль» в группе «События» перейдите по ссылке Инициализация. В редакторе программного кода вызовите функцию CreateApprovalRole() в обработчике события Initializing():
/// <summary>
/// Обработчик события инициализации.
/// </summary>
public override void Initializing(Sungero.Domain.ModuleInitializingEventArgs e)
{
CreateDefaultPurchaseKinds();
CreateDocumentTypes();
CreateDocumentKinds();
GrantCreateRightsOnPurchaseContract();
GrantAccessRightsForDatabook();
CreateApprovalRole(Trade.Purchases.PurchaseApprovalRole.Type.
PurchInitiator, "Инициатор закупки.");
}
Важно. Замените в коде Trade.Purchases на <Ваш код компании>.Purchases.
Ограничение доступности роли по типам этапов согласования
Роль «Инициатор закупки» должна быть доступной для выбора в следующих этапах согласования: «Согласование», «Задание», «Уведомление».
Настройте доступность роли в справочнике Этапы согласования (ApprovalStage). Для этого:
1.Перекройте справочник Sungero.Docflow.ApprovalStage. Проверьте, что в списке зависимостей вашего решения указан модуль Sungero.Docflow. При необходимости добавьте его. Если в решении не указаны зависимости от перекрытых модулей, то при публикации могут возникнуть ошибки.
2.Переопределите разделяемую функцию GetPossibleRoles(). Для этого в редакторе перекрытого справочника добавьте код разделяемой функции:
public override List<Enumeration?> GetPossibleRoles()
{
var baseRoles = base.GetPossibleRoles();
if (_obj.StageType == Sungero.Docflow.ApprovalStage.StageType.Approvers ||
_obj.StageType == Sungero.Docflow.ApprovalStage.StageType.SimpleAgr ||
_obj.StageType == Sungero.Docflow.ApprovalStage.StageType.Notice)
{
baseRoles.Add(Trade.Purchases.PurchaseApprovalRole.Type.PurchInitiator);
}
return baseRoles;
}
Важно. Замените в коде Trade.Purchases на <Ваш код компании>.Purchases.
В результате после инициализации системы новую роль можно выбирать в заданных этапах согласования:
Ограничение доступности роли по видам документов
Роль «Инициатор закупки» нужна только при согласовании договоров закупки с видом документа: договор закупки расходных материалов, договор закупки оборудования, договор прочих закупок. Поэтому необходимо добавить проверку того, что роль в правиле согласования используется только с данными видами документов.
Для этого:
1.Переопределите разделяемую функцию Filter(). Для этого в редакторе справочника Роль инициатор закупки (PurchaseApprovalRole) добавьте код:
public override List<Sungero.Docflow.IDocumentKind> Filter(List<Sungero.Docflow.IDocumentKind> kinds)
{
var query = base.Filter(kinds);
if (_obj.Type == Trade.Purchases.PurchaseApprovalRole.Type.PurchInitiator)
query = query.Where(k => k.DocumentType.DocumentTypeGuid == "9159dcfe-e779-4cca-95ce-c4c59b77c6c0").ToList();
return query;
}
2.Замените:
•код Trade.Purchases на <Ваш код компании>.Purchases;
•идентификатор "9159dcfe-e779-4cca-95ce-c4c59b77c6c0" на идентификатор (GUID) типа документа «Договор закупки». Для этого выделите тип документа «Договор закупки» (PurchaseContract) в дереве решений и в контекстном меню выберите пункт Скопировать идентификатор:
В результате при сохранении правила согласования будет вызываться данная функция и проверяться доступность роли по видам документов:
© Компания Directum, 2024 |