Пользовательские бизнес-правила мобильного приложения
Glossary Item Box
Общие сведения
Бизнес-правила являются одним из механизмов bpm'online, позволяющим настраивать поведение полей на странице редактирования записи. С их помощью можно, например, настроить обязательность и видимость полей, их доступность и т. п. Подробно бизнес-правила рассмотрены в статье "Бизнес-правила мобильного приложения".
В мобильном приложении существует возможность добавлять бизнес-правило, реализующее пользовательскую логику — пользовательское бизнес-правило. Для такого бизнес-правила предусмотрен тип Terrasoft.RuleTypes.Custom.
Свойства конфигурационного объекта config
При добавлении пользовательского бизнес-правила с помощью метода Terrasoft.sdk.Model.addBusinessRule(name, config) можно использовать свойства конфигурационного объекта config базового бизнес-правила (см. "Бизнес-правила мобильного приложения"). Также дополнительно предусмотрено свойство executeFn.
Используемые свойства конфигурационного объекта config:
- ruleType — тип правила. Для пользовательских правил должно содержать значение Terrasoft.RuleTypes.Custom.
- triggeredByColumns — массив колонок, инициирующих срабатывание бизнес-правила.
- events — массив событий, определяющий время запуска бизнес-правил. Должен содержать значения из перечисления Terrasoft.BusinessRuleEvents. Значение по умолчанию: Terrasoft.BusinessRuleEvents.ValueChanged.
- executeFn — функция-обработчик, содержащая пользовательскую логику выполнения бизнес-правила.
Перечисление Terrasoft.BusinessRuleEvents содержит следующие значения:
- Тerrasoft.BusinessRuleEvents.Save — правило стработает перед сохранением данных.
- Terrasoft.BusinessRuleEvents.ValueChanged — правило стработает после изменения данных (при редактировании).
- Terrasoft.BusinessRuleEvents.Load — правило стработает при открытии страницы редактирования.
Свойства функции-обработчика executeFn
Функция-обработчик, объявляемая в свойстве executeFn должна иметь следующую сигнатуру:
executeFn: function(record, rule, checkColumnName, customData, callbackConfig, event) {
}
Параметры функции:
- record — запись, для которой выполняется бизнес-правило.
- rule — экземпляр текущего бизнес-правила.
- checkColumnName — название колонки, которая вызвала срабатывание бизнес-правила.
- customData — объект, разделяемый между всем правилами. Не используется. Оставлен для совместимости с предыдущими версиями.
- callbackConfig — конфигурационный объект асинхронного возврата Ext.callback.
- event — событие, по которому было запущено бизнес-правило.
При завершении работы функции необходимо обязательно вызвать или callbackConfig.success , или callbackConfig.failure. Рекомендуются следующие варианты вызова:
Ext.callback(callbackConfig.success, callbackConfig.scope, [result]); Ext.callback(callbackConfig.failure, callbackConfig.scope, [exception]);
Где:
- result — возвращаемое логическое значение, полученное при выполнении функции (true/false).
- exception — исключение типа Terrasoft.Exception, возникшее в функции-обработчике.
В исходном коде функции-обработчика удобно использовать следующие методы модели, передаваемой в параметре record:
- get(columnName) — для получения значения колонки записи. Аргумент columnName должен содержать название колонки.
-
set(columnName, value, fireEventConfig) — для установки значения колонки записи. Параметры:
- columnName — название колонки.
- value — значение, присваиваемое колонке.
- fireEventConfig — конфигурационный объект для установки свойств, передаваемых в событие изменения колонки.
-
changeProperty(columnName, propertyConfig) — для изменения свойств колонки, кроме ее значения. Аргумент columnName должен содержать название колонки, а propertyConfig — объект, устанавливающий свойства колонки. Возможные свойства объекта propertyConfig:
- disabled — активность колонки. Если true, то элемент управления, связанный с колонкой, будет неактивным и закрытым для работы.
- readOnly — признак "только для чтения". Если true, то элемент управления, связанный с колонкой, будет доступен только для чтения. Если false — для чтения и записи.
- hidden — видимость колонки. Если true, то элемент управления, связанный с колонкой, будет скрыт. Если false — отображен.
- addFilter — добавить фильтр. Если свойство указано, то в нем должен быть указан фильтр типа Terrasoft.Filter, который будет добавлен к фильтрации колонки. Свойство используется только для справочных полей.
- removeFilter — удалить фильтр. Если свойство указано, то в нем должно быть указано имя фильтра, который будет удален из фильтрации колонки. Свойство используется только для справочных полей.
- isValid — признак корректности колонки. Если свойство указано, то оно изменит признак корректности элемента управления, связанного с колонкой. Если колонка некорректна, то это может означать отмену событий по сохранению записи, а также может привести к признанию записи некорректной.
Например, для изменения свойств (но не значения) колонки "Owner":
record.changeProperty("Owner", { disabled: false, readOnly: false, hidden: false, addFilter: { property: "IsChief", value: true }, isValid: { value: false, message: LocalizableStrings["Owner_should_be_a_chief_only"] } });
Примеры пользовательского бизнес-правила
Пример 1
Требуется выделить поле с результатом активности, если ее статус "Завершена", сам поле [результат] не заполнено и есть значение в колонке ProcessElementId.
// Правило для страницы редактирования активности. Terrasoft.sdk.Model.addBusinessRule("Activity", { // Название бизнес-правила. name: "ActivityResultRequiredByStatusFinishedAndProcessElementId", // Тип бизнес-правила: пользовательское. ruleType: Terrasoft.RuleTypes.Custom, // Правило инициируется колонками Status и Result. triggeredByColumns: ["Status", "Result"], // Правило отработает перед сохранением данных и после изменения данных. events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save], // Функция-обработчик. executeFn: function(record, rule, column, customData, callbackConfig) { // Признак корректности свойства и правила. var isValid = true; // Значение колонки ProcessElementId. var processElementId = record.get("ProcessElementId"); // Если значение не пустое. if (processElementId && processElementId !== Terrasoft.GUID_EMPTY) { // Установка признака корректности. isValid = !(record.get("Status.Id") === Terrasoft.Configuration.ActivityStatus.Finished && Ext.isEmpty(record.get("Result"))); } // Изменение свойств колонки Result. record.changeProperty("Result", { // Установка признака корректности колонки. isValid: { value: isValid, message: Terrasoft.LS["Sys.RequirementRule.message"] } }); // Асинхронный возврат значений. Ext.callback(callbackConfig.success, callbackConfig.scope, [isValid]); } });
Пример 2
Добавление и удаление фильтрации по пользовательской логике.
Terrasoft.sdk.Model.addBusinessRule("Activity", { name: "ActivityResultByAllowedResultFilterRule", position: 1, ruleType: Terrasoft.RuleTypes.Custom, triggeredByColumns: ["Result"], events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Load], executeFn: function(record, rule, column, customData, callbackConfig) { var allowedResult = record.get("AllowedResult"); var filterName = "ActivityResultByAllowedResultFilter"; if (!Ext.isEmpty(allowedResult)) { var allowedResultIds = Ext.JSON.decode(allowedResult, true); var resultIdsAreCorrect = true; for (var i = 0, ln = allowedResultIds.length; i < ln; i++) { var item = allowedResultIds[i]; if (!Terrasoft.util.isGuid(item)) { resultIdsAreCorrect = false; break; } } if (resultIdsAreCorrect) { var filter = Ext.create("Terrasoft.Filter", { name: filterName, property: "Id", funcType: Terrasoft.FilterFunctions.In, funcArgs: allowedResultIds }); record.changeProperty("Result", { addFilter: filter }); } else { record.changeProperty("Result", { removeFilter: filterName }); } } else { record.changeProperty("Result", { removeFilter: filterName }); } Ext.callback(callbackConfig.success, callbackConfig.scope, [true]); } });
Пример 3
Пример логики сбрасывания отрицательных значений в 0.
Terrasoft.sdk.Model.addBusinessRule("Opportunity", { name: "OpportunityAmountValidatorRule", ruleType: Terrasoft.RuleTypes.Custom, triggeredByColumns: ["Amount"], events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save], executeFn: function(model, rule, column, customData, callbackConfig) { var revenue = model.get("Amount"); if ((revenue < 0) || Ext.isEmpty(revenue)) { model.set("Amount", 0, true); } Ext.callback(callbackConfig.success, callbackConfig.scope); } });
Пример 4
Пример генерации заголовка активности для решения FieldForce.
Terrasoft.sdk.Model.addBusinessRule("Activity", { name: "FieldForceActivityTitleRule", ruleType: Terrasoft.RuleTypes.Custom, triggeredByColumns: ["Account", "Type"], events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Load], executeFn: function(record, rule, column, customData, callbackConfig, event) { if (event === Terrasoft.BusinessRuleEvents.ValueChanged || record.phantom) { var type = record.get("Type"); var typeId = type ? type.get("Id") : null; if (typeId !== Terrasoft.Configuration.ActivityTypes.Visit) { Ext.callback(callbackConfig.success, callbackConfig.scope, [true]); return; } var account = record.get("Account"); var accountName = (account) ? account.getPrimaryDisplayColumnValue() : ""; var title = Ext.String.format("{0}: {1}", Terrasoft.LocalizableStrings.FieldForceTitlePrefix, accountName); record.set("Title", title, true); } Ext.callback(callbackConfig.success, callbackConfig.scope, [true]); } });