Бизнес-правила мобильного приложения. Булево значение для фильтра
Добрый день, уважаемые коллеги!
Есть задача в мобильном приложении (уже давно функционирующем) изменить на карточке Контрагента логику поля Подразделение . В справочнике Подразделений добавлено булево поле UsrProhibitSelectionAccount, если true, то запрещать подразделение к выбору.
Рассматриваю применение 2-х вариантов:
Бизнес-правило 1: Фильтр записей Подразделений по признаку UsrProhibitSelectionAccount (см. ниже 1-й метод). Метод отрабатывает и при выборе отображает только то, что можно
Бизнес-правило 2: Выдавать сообщение пользователю, если выбранная ранее запись некорректна (см. ниже 2-й метод). И вот тут почему-то в консоли видно, что не считывается корректно значение поля UsrProhibitSelectionAccount. Оно всегда false. Правда не во всех записях оно заполнено (см. скрин).
Помогите, пожалуйста, определить в чем некорректность 2-го метода. Благодарю за помощь
// Правило 1
/*Terrasoft.sdk.Model.addBusinessRule("Account", {
ruleType: Terrasoft.RuleTypes.Filtration,
position: 1,
triggeredByColumns: ["UsrDepartment"],
events: [Terrasoft.BusinessRuleEvents.ValueChanged,Terrasoft.BusinessRuleEvents.Load],
message: Terrasoft.LocalizableStrings.DepartmentMustBeAllowed,
filters: Ext.create("Terrasoft.Filter", {
modelName: "UsrAccountDepartments",
property: "UsrProhibitSelectionAccount",
value: false
})
});*/
// Правило 2
Terrasoft.sdk.Model.addBusinessRule("Account", {
name: "AccountDepartmentMustBeAllowedRule",
ruleType: Terrasoft.RuleTypes.Custom,
triggeredByColumns: ["UsrDepartment"],
events: [Terrasoft.BusinessRuleEvents.Load,
Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
executeFn: function(record, rule, column, customData, callbackConfig) {
var AccountDepartment = record.get("UsrDepartment");
var isValid = AccountDepartment.get("UsrProhibitSelectionAccount");
record.changeProperty("UsrDepartment", {
isValid: {
value: isValid,
message: Terrasoft.LocalizableStrings.DepartmentMustBeAllowed
}
});
Ext.callback(callbackConfig.success, callbackConfig.scope, [isValid]);
}
});
![]()
![]()
Нравится
Марина, а оно точно так должно синхронно читать из объекта справочника так, как у Вас?
В схеме MobileActivityOpportunityModelConfig значение Opportunity.Account читают с асинхронным вызовом так:
Terrasoft.sdk.Model.addBusinessRule("Activity", {
name: "ActivityAccountOpportunityFiltrationRule",
ruleType: Terrasoft.RuleTypes.Filtration,
events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
triggeredByColumns: ["Account"],
filteredColumn: "Opportunity",
filters: Ext.create("Terrasoft.Filter", {
property: "Account"
})
});
Terrasoft.sdk.Model.addBusinessRule("Activity", {
name: "ActivityAccountByOpportunityRule",
ruleType: Terrasoft.RuleTypes.Custom,
triggeredByColumns: ["Opportunity"],
events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save,
Terrasoft.BusinessRuleEvents.Load],
executeFn: function(record, rule, column, customData, callbackConfig) {
var opportunityRecord = record.get("Opportunity");
if (opportunityRecord) {
var accountRecord = record.get("Account");
if (!accountRecord) {
var opportunityModel = Ext.ModelManager.getModel("Opportunity");
opportunityModel.load(opportunityRecord.getId(), {
isCancelable: false,
queryConfig: Ext.create("Terrasoft.QueryConfig", {
columns: ["Account"],
modelName: "Opportunity"
}),
success: function(loadedRecord) {
if (loadedRecord) {
record.set("Account", loadedRecord.get("Account"), true);
}
Ext.callback(callbackConfig.success, callbackConfig.scope);
},
failure: function(record, operation) {
var exception = operation.getError();
Ext.callback(callbackConfig.failure, callbackConfig.scope, [exception]);
},
scope: this
});
return;
}
}
Ext.callback(callbackConfig.success, callbackConfig.scope);
},
position: 1
});Также на скриншоте видно, что колонка UsrProhibitSelectionAccount в локальной БД пустая. Из-за этого логика может отрабатывать некорректно. Нужно правильно настроить фильтрацию синхронизации в манифесте и пересинхронизировать с нуля.
Марина, а оно точно так должно синхронно читать из объекта справочника так, как у Вас?
В схеме MobileActivityOpportunityModelConfig значение Opportunity.Account читают с асинхронным вызовом так:
Terrasoft.sdk.Model.addBusinessRule("Activity", {
name: "ActivityAccountOpportunityFiltrationRule",
ruleType: Terrasoft.RuleTypes.Filtration,
events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
triggeredByColumns: ["Account"],
filteredColumn: "Opportunity",
filters: Ext.create("Terrasoft.Filter", {
property: "Account"
})
});
Terrasoft.sdk.Model.addBusinessRule("Activity", {
name: "ActivityAccountByOpportunityRule",
ruleType: Terrasoft.RuleTypes.Custom,
triggeredByColumns: ["Opportunity"],
events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save,
Terrasoft.BusinessRuleEvents.Load],
executeFn: function(record, rule, column, customData, callbackConfig) {
var opportunityRecord = record.get("Opportunity");
if (opportunityRecord) {
var accountRecord = record.get("Account");
if (!accountRecord) {
var opportunityModel = Ext.ModelManager.getModel("Opportunity");
opportunityModel.load(opportunityRecord.getId(), {
isCancelable: false,
queryConfig: Ext.create("Terrasoft.QueryConfig", {
columns: ["Account"],
modelName: "Opportunity"
}),
success: function(loadedRecord) {
if (loadedRecord) {
record.set("Account", loadedRecord.get("Account"), true);
}
Ext.callback(callbackConfig.success, callbackConfig.scope);
},
failure: function(record, operation) {
var exception = operation.getError();
Ext.callback(callbackConfig.failure, callbackConfig.scope, [exception]);
},
scope: this
});
return;
}
}
Ext.callback(callbackConfig.success, callbackConfig.scope);
},
position: 1
});Также на скриншоте видно, что колонка UsrProhibitSelectionAccount в локальной БД пустая. Из-за этого логика может отрабатывать некорректно. Нужно правильно настроить фильтрацию синхронизации в манифесте и пересинхронизировать с нуля.
Зверев Александр,
Александр, большое спасибо за рекомендации. Да, видимо, я неверно читаю объект справочника. Надо попробовать разобраться с асинхронным вызовом. Спасибо за приведенный пример.
Заполнение колонки UsrProhibitSelectionAccount в локальной базе пока не помогло.