Всем доброго времени суток!

Есть задача при изменении кол-ва продуктов или же изменении продукта в детали Продукт в заказе просчитывать Amount и TotalAmount. Реализую данную задачу через пользовательское бизнес правило:

 

Terrasoft.sdk.Model.addBusinessRule("OrderProduct", {
	name: "WaOrderProductAmountValidatorRule",
	ruleType: Terrasoft.RuleTypes.Custom,
	triggeredByColumns: ["Quantity", "Product"],
	events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
	executeFn: function(model, rule, column, customData, callbackConfig) {
		window.console.info(model);
		debugger;
		var product = model.get("Product");
		if ((!product) || Ext.isEmpty(product)) {
			model.set("Price", 0, true);
			model.set("TotalAmount", 0, true);
			model.set("Amount", 0, true);
		} else {
			var quantity = model.get("Quantity");
			var price = product.get("Price");
			var amount = quantity * price;
			model.set("Amount", amount, true);
			model.set("TotalAmount", amount, true);
		}
		Ext.callback(callbackConfig.success, callbackConfig.scope);
	}
});

Но почему то значение цены продукта возвращает null:

 

{
	"modified":{
		"Id":"fbfb2d62-4439-486b-ae2f-b360f9e899f8"
	},
	"raw":{},
	"stores":[],
	"data":{
		"Id":"1fd85496-4cc0-485c-ad37-bb91857e65df",
		"Name":"Гидрогелевая маска для лица WOW Mask",
		"ProcessListeners":null,
		"Price":null,
		"Active":false,
		"IsArchive":false
	},
	"_data":{
		"Id":"1fd85496-4cc0-485c-ad37-bb91857e65df",
		"Name":"Гидрогелевая маска для лица WOW Mask",
		"ProcessListeners":null,
		"Price":null,
		"Active":false,
		"IsArchive":false
	},
	"id":"fbfb2d62-4439-486b-ae2f-b360f9e899f8",
	"internalId":"fbfb2d62-4439-486b-ae2f-b360f9e899f8",
	"phantom":true,
	"dirty":true
}

Хотя значение цены есть - http://prntscr.com/my9x2o

Нравится

3 комментария
Лучший ответ

Нигрескул Алексей,

Такое происходит из-за того, что в конфиг запроса для справочной колонки никоим образом не была добавлена нужная колонка. Можно в явном виде добавить таким кодом где-нибудь в ModuleConfig:

    var additionalProductColumns = ["Price", /*прочие колонки*/];
    var productQueryConfig = Terrasoft.sdk.LookupGridPage.getQueryConfig("Product");
    Terrasoft.sdk.LookupGridPage.updateQueryConfigColumns(null, {columns: additionalProductColumns}, productQueryConfig);

Либо можно для converFuction первичной или вторичной колонки добавить её в LookupGridPage.

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

var controller = Terrasoft.app.getControllerInstances()["MyController"];
//Можно задебажиться и посмотреть, какие экземпляры контроллеров есть, среди них должен быть нужный
var control = controller.getFieldByName("MyColumn", record);
control.setValue(value);

Или ещё вариант:

var control = Ext.getCmp("{ViewId}_{PageType}_{ColumnName}_Column");
// {ViewId} - id представления, {PageType} - тип страницы Edit или Preview, {ColumnName} - название колонки, например AccountPage_Edit_AlternativeName_Column
control.setValue(value);

 

Бершеда Д. Н.,

 Здравствуйте! Я настроил кастомное правило и все хорошо изменяется, в данном случае сумма в зависимости от цены и кол-ва товаров. Вопрос в другом, не видит значение цены продукта, вот пример:

Есть заказ с продуктами -

http://prntscr.com/mz1088, меняю кол- во продукта срабатывает правило - http://prntscr.com/mz10kr

Мне возвращает цену продукта null - http://prntscr.com/mz10vd

Почему так происходит? В манифест зависимости добавил.

Нигрескул Алексей,

Такое происходит из-за того, что в конфиг запроса для справочной колонки никоим образом не была добавлена нужная колонка. Можно в явном виде добавить таким кодом где-нибудь в ModuleConfig:

    var additionalProductColumns = ["Price", /*прочие колонки*/];
    var productQueryConfig = Terrasoft.sdk.LookupGridPage.getQueryConfig("Product");
    Terrasoft.sdk.LookupGridPage.updateQueryConfigColumns(null, {columns: additionalProductColumns}, productQueryConfig);

Либо можно для converFuction первичной или вторичной колонки добавить её в LookupGridPage.

Показать все комментарии

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

Можно ли как-то унаследовать правила? Ибо, копи-паста - это как-то не хорошо...

Нравится

3 комментария
Лучший ответ

Насколько мне известно, унаследовать правила нельзя.

Чтобы не дублировать можно реализовать в отдельном методе установку обязательности полей и потом вызвать его для всех колонок, для которых нужно устанавливать обязательность.

Но, как показывает практика, правила обязательности всегда работают корректно, а вот с собственной реализацией могут возникнут нюансы laugh

Насколько мне известно, унаследовать правила нельзя.

Чтобы не дублировать можно реализовать в отдельном методе установку обязательности полей и потом вызвать его для всех колонок, для которых нужно устанавливать обязательность.

Но, как показывает практика, правила обязательности всегда работают корректно, а вот с собственной реализацией могут возникнут нюансы laugh

Алла Савельева,

вот, да, но копипастить не хочется. Может кто из разрабов ответит?

Если стандартными средствами настроить правила не получится, можно делать кодом, привязав им всем «isRequired» к логике какой-либо функции. Например, такой код есть в EmailTemplateUserTaskPropertiesPage.

Показать все комментарии

Было бы здорово, если строки и конкретные поля разделов/деталей можно было "раскрашивать" в бизнес-правилах

8 комментариев

для строк уже реализовано

https://marketplace.terrasoft.ru/app/color-filling-records-bpmonline

Здравствуйте!

Передали данное пожелание команде разработки для анализа возможности внедрения такой возможности в будущих версиях продукта.

Это дополнение реализовано компанией «CRM Tools», с пожеланиями дополнительной логики  лучше будет также обратиться и к ним. Будет странно, если поля будут помечаться цветом стандартно, а для строк придётся устанавливать дополнение.

 

gfdshdfsh,

К сожалению, там недостаточная реализация: можно брать только справочное поле, нельзя красить по 2 и больше вариантам, нет возможности покрасить только одно поле, при выделение строки все равно включается базовый цвет. Разработчикам отписался, но обратной связи так и нет.

Быстров Сергей,

 

печально, но для "простой" раскраски реестра этот вариант подходит. Так же не ясно как раскрасить детали

Очень хотелось бы конечно иметь более полноценный набор функций:

возможность раскраски строк и ячеек,

возможность выбора более одной колонки для создания правила,

для пересечения иметь приоритет раскраски!

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

Возможно, они разработают больше возможностей в новой версии или под заказ. Попробуйте связаться с авторами дополнения.

Есть дополнение Fields color highlighting for bpm'online, оно позволяет выделять фон и текст полей в карточке записей любого раздела различным цветами для заданных ролей пользователей. 

Показать все комментарии

Добрый день,

 

Столкнулся с проблемой фильтрации справочных полей при помощи бизнес правил,

есть Справочник улиц (Street) у которого соответственно есть принадлежность к выше стоящим элементам(Городам, Районам, Регионам и др.) 

Выглядит примерно следующим образом

╔══════════════╤═════════════════════╤══════════════════════════════════════╤══════════════════════════════════════╤══════════════════════════════════════╤══════════════════════════════════════╗
║ Name         │ TerritorialObjectId │ LocalityId                           │ DistrictId                           │ RegionId                             │ CountryId                            ║
╠══════════════╪═════════════════════╪══════════════════════════════════════╪══════════════════════════════════════╪══════════════════════════════════════╪══════════════════════════════════════╣
║ ул. Королёва │ NULL                │ NULL                                 │ NULL                                 │ B0FDED10-AEE0-4F1B-9C8D-198F7C154257 │ 5A1FEFDA-56A4-48A2-BC77-E40C71EEC73B ║
╟──────────────┼─────────────────────┼──────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
║ ул. Ф.Торо   │ NULL                │ 967FC3D7-EBBA-4B76-AEDD-FE1CA5B48157 │ 7B11D4CE-D3E2-487F-BE03-A620015FB4FA │ EED82307-32D6-47EF-BDD8-FA64FE399614 │ 5A1FEFDA-56A4-48A2-BC77-E40C71EEC73B ║
╚══════════════╧═════════════════════╧══════════════════════════════════════╧══════════════════════════════════════╧══════════════════════════════════════╧══════════════════════════════════════╝

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

Бизнес правило по улице заполнено следующим образом

"Street": {
	"FiltrationStreetByTerritorialObject": {
		ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
		autocomplete: true,
		autoClean: true,
		baseAttributePatch: "TerritorialObject",
		comparisonType: Terrasoft.ComparisonType.EQUAL,
		type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		attribute: "TerritorialObject"
	},
	"FiltrationStreetByLocality": {
		ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
		autocomplete: true,
		autoClean: true,
		baseAttributePatch: "Locality",
		comparisonType: Terrasoft.ComparisonType.EQUAL,
		type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		attribute: "Locality"
	},
	"FiltrationStreetByDistrict": {
		ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
		autocomplete: true,
		autoClean: true,
		baseAttributePatch: "District",
		comparisonType: Terrasoft.ComparisonType.EQUAL,
		type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		attribute: "District"
	},
	"FiltrationStreetByRegion": {
		ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
		autocomplete: true,
		autoClean: true,
		baseAttributePatch: "Region",
		comparisonType: Terrasoft.ComparisonType.EQUAL,
		type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		attribute: "Region"
	},
	"FiltrationStreetByCountry": {
		ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
		autocomplete: true,
		autoClean: true,
		baseAttributePatch: "Country",
		comparisonType: Terrasoft.ComparisonType.EQUAL,
		type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		attribute: "Country"
	}
}

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

Я что то упускаю?

Нравится

4 комментария
Лучший ответ

Сериков Асхат Кайратович,

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

Это решается также через другое свойство атрибута - dependencies.

Подробнее можно почитать здесь и посмотреть пример вот здесь.

Насколько мне известно, такой код работать не будет.

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

Алла Савельева,

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

autocomplete: true,

должен был выполнять

Сериков Асхат Кайратович,

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

Это решается также через другое свойство атрибута - dependencies.

Подробнее можно почитать здесь и посмотреть пример вот здесь.

Алла Савельева,

Спасибо, так и делаю на данный момент, думал может я что то упустил поэтому не работает автоматическое заполнение

Показать все комментарии

Есть правило видимости, делать поле видимым в зависимости от значения другого поля.

Все работает

Terrasoft.sdk.Model.addBusinessRule("Account", {

    ruleType: Terrasoft.RuleTypes.Visibility,

    conditionalColumns:

        [

            {name: "UsrStage", value: "a5d0ceac-3ef4-45e0-be25-af3a1190f6f9"}

        ],

        triggeredByColumns: ["UsrStage"],

        dependentColumnNames: ["UsrInstalationDate"]

    }

);

Как сделать такое же правило, но для признака "обязательно для заполнения".

То есть это же самое поле, при таких же условиях должно становиться еще и обязательным для заполнения.

Проблема в том, что для мобильной версии не совсем понятно как настраивать правила. В документации описания и примеры не очень понятные

 

 

Нравится

4 комментария
Лучший ответ

Requirement правило не поможет в данном случае. Нужно использовать Custom. Что-то вроде этого.

Terrasoft.sdk.Model.addBusinessRule("UsrMyModel", {
    name: "RuleName",
    ruleType: Terrasoft.RuleTypes.Custom,
    triggeredByColumns: [/*Список колонок, которые активируют правило*/],
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        var hasError = false; //булевая переменная, указывающая корректность поля.
        var errorMessage = "Необходимо указать значение."; // Сообщение об ошибке.
        //Выполняем нужный код, определяющий наличие ошибки
        record.changeProperty("UsrMyColumn", {
            isValid: {
                value: hasError,
                message: errorMessage
            }
        });
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
});

 

Обязательность задаётся как Terrasoft.RuleTypes.Requirement. В конфигурации есть много примеров использования. Например, в MobileContactAddressModelConfig так:

Terrasoft.sdk.Model.addBusinessRule("ContactAddress", {
    name: "ContactAddressRequirementRule",
    ruleType: Terrasoft.RuleTypes.Requirement,
    requireType: Terrasoft.RequirementTypes.OneOf,
    triggeredByColumns: ["Address", "City", "Country"],
    position: 3
});

 

Поясните, что сделает это правило? Все колонки указанные в triggeredByColumns буду обязательные? Мне примерно также нужно, только в зависимости от значения определенного поля.

Requirement правило не поможет в данном случае. Нужно использовать Custom. Что-то вроде этого.

Terrasoft.sdk.Model.addBusinessRule("UsrMyModel", {
    name: "RuleName",
    ruleType: Terrasoft.RuleTypes.Custom,
    triggeredByColumns: [/*Список колонок, которые активируют правило*/],
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        var hasError = false; //булевая переменная, указывающая корректность поля.
        var errorMessage = "Необходимо указать значение."; // Сообщение об ошибке.
        //Выполняем нужный код, определяющий наличие ошибки
        record.changeProperty("UsrMyColumn", {
            isValid: {
                value: hasError,
                message: errorMessage
            }
        });
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
});

 

Бершеда Д. Н.,

Спасибо за ответ.

Можно, пожалуйста, на простом примере объяснить?

 

Показать все комментарии

Коллеги, добрый день!

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

Ну и соотвественно обратно снимать, если это условие перестает соблюдаться.

Каким способом лучше это сделать?

Спасибо!!)

 

 

 

Нравится

7 комментариев
Лучший ответ

Бп. А в странице к описанию детали влепить subscriber и делать loadEntity (грубо говоря — аналогично стандартной логике в заказе)

Бп. А в странице к описанию детали влепить subscriber и делать loadEntity (грубо говоря — аналогично стандартной логике в заказе)

Можно и триггером в базе вместо БП. Особенно, если на деталь льют записи извне в обход движка EntitySchemaQuery.

Доброе утро. Дабы не плодить новую тему. Не могли бы вы поделиться примером работы subscriber? Есть задача суммировать значения полей в детали и выводить их на карточке. Заполненение поля через БП проходит корректно, но не в онлайн режиме, поле обновляется только после перезагрузки страницы.

Трефилов Павел Сергеевич,

ContactAnniversary: {
	schemaName: "ContactAnniversaryDetailV2",
	filter: {
		masterColumn: "Id",
		detailColumn: "Contact"
	},
	subscriber: {
		"methodName": "sendSaveCardModuleResponse"
	}
}

Вот, допустим, из базовой страницы контакта. Метод sendSaveCardModuleResponse располагается в BasePageV2. Встаньте туда дебаггером через консоль и попробуйте поудалять/подобавлять записей в деталь "знаменательные события". При каждом изменении чего-нибудь в детали - тут же отрабатывает метод. В идеале в нём же делать this.reloadEntity (чтобы обновились поля карточки, которые были перерасчитаны по бп)

Варфоломеев Данила,

Данила, спасибо огромное! Сделали. 

Только тут асинхронность проявилась. Сабскрайбер отрабатывает и обновляет страницу быстрее чем отрабатывает БП. Как послать сигнал из БП чтобы страница обновилась после завершения БП. Ну кроме, как таймаут ставить). Спасибо!!!

Елена К,

Ничего адекватного, кроме переделки всех пересчётов под клиентский esq, посоветовать в таком случае не могу (ну за исключением костыля - отправки сообщения по websocket в конце бп).

Варфоломеев Данила,

Да, так и сделали. Спасибо вам!!)

 

Показать все комментарии

Коллеги, подскажите, как в преднастроенной странице, которая в бизнес-процессах сделать зависимость полей?

Есть два поля "Страны" и "Города" оба поля лукапы. Как при выборе Страны фильтровать значения в поле "Города"?

 

Нравится

2 комментария

Евгений, здравствуйте!

Настройка бизнес-правил для преднастроенных страниц реализована в версии 7.12.0. Вы можете настроить бизнес - правила для добавления фильтрации по аналогии с настройкой в мастере раздела.

Для Вашей задачи правило будет выглядеть примерно следующим образом: Если - то.

Показать все комментарии

Добрый день, Коллеги!

На нескольких проектах столкнулись со следующей ситуацией.

Описания кейса:



1) Рассмотрим раздел обращения, Колонки "Контакт" и "Контрагент".

Пробуем добавить новый контакт через "Всплывающее действие" при вводе не существующего ФИО в системе.



https://yadi.sk/i/OQCOmeQw3TedkE



В результате при клике на "действие создания" далее откроется миникарточка контакта для заполнения.

Штатный функционал работает корректно.

 

Потребность:

Необходимо добавить сложный фильтр для lookup "Контакта".

Логика фильтра: Если "Контрагент" заполнен, то отображать к выбору только те контакты, у которых на детали "Карьера контакта" (деталь в разделе контакт) есть записи по связанному контрагенту, Который выбран в обращении.



Был выбран способ реализации путём задания фильтра через атрибуты.

"Contact": {
                lookupListConfig: {
                    filters: [
                        function() {
                            var accountId = this.get("Account");
                            var filterGroup = Ext.create("Terrasoft.FilterGroup");
                            if (accountId){
                                var filterById = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[ContactCareer:Contact].Account", accountId.value);
                                filterGroup.add("filterById", filterById);
                            return filterGroup;
                        }
                    ]
                }
            }



Фильтрация работает корректно.



2) Однако возникла следующая проблема, которой нет при создании фильтров через бизнес-правила:



При указании такого фильтра, пытаемся выполнить шаги пункта (1) по добавлению не существующего в системе контакта и действием вызвать миникарточку.

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



https://yadi.sk/i/4baUZyPr3Tee7E



Есть только возможность выбора из отфильтрованных значений.



https://yadi.sk/i/a-qH6I0R3TefZq

https://www.screencast.com/t/6Mu2hFnkt



Если, согласно условию if, Контрагент не заполнен, то действие для создания появляется.



https://yadi.sk/i/HaQF5U1L3Teg7r



Коллеги, просим подсказать как можно обойти подобное поведение?

Возможно есть простой способ реализации подобного фильтра через бизнес-правила? У нас попросту не получилось организовать подобный фильтр другим способом.

Заранее спасибо!

Нравится

2 комментария

Чисто в теории в LookupQuickAddMixin отсекается возможность быстрого создания, если функция checkIsComplicatedFiltersExists вернёт true. Можно прям на странице переопределить эту функцию

checkIsComplicatedFiltersExists: function() {
	return false;
}

и система предложит создать контакта. Не факт, однако, что что-нибудь не накроется тазом в какой-то момент (не зря же есть функция по проверки сложных фильтров). Лично я быстро накидал, потестил на дефолтной странице договора - все отрабатывает.

Варфоломеев Данила,

Спасибо за подсказку! Закрыли задачу!

Показать все комментарии

Коллеги, здравствуйте.

Возник вопрос по выводу печатных форм на странице при условии определённого типа значения в колонке.

К примеру, в объекте "договоры" в типе договора указано значение "доп.соглашение" и выводились печатные формы только с наименованием "доп.соглашение".

Заранее спасибо!

Нравится

1 комментарий

Роман, здравствуйте!

На данный момент настроить нужную Вам фильтрацию печатных форм можно только доработкой. Детально этот вопрос рассматривался в другом посте  Community: https://community.terrasoft.ru/questions/filtr-pecatnyh-form

Показать все комментарии

Подскажите, как в Процессе изменить Бизнес-Правило ограничивающее доступ на редактирование поля? Какой элемент процесса нужно использовать?

Нравится

3 комментария

имеется в виду бизнес-процесс ?

Севостьянов Илья Сергеевич,

Да.

я не уверен, что такая возможность имеется, именно в виде "изменить бизнес-правило", но можно создать бизнес-правила выполнение которых зависит от значения атрибута модели, и например "скрытое поле" в целевом объекте, в бизнес-процессе устанавливать значение в это поле, а в целевой схеме предусмотреть логику (н/п в onEntityInitialized) которая опираясь на значение вышеуказанного поля будет устанавливать значение в атрибут модели.

Итоговый результат, ИМХО - это тот кейс, который вы хотите реализовать, насколько я понял.

Показать все комментарии