Добрый день.

Коллеги, прошу помочь.

Бизнес-задача: необходимо выделить запись в реестре Контрагентов, если в контрагенте добавлен юридический адрес.

 

Реализация через запрос esq:

prepareResponseCollectionItem: function(item) {
    this.callParent(arguments);
	let accountId = item.get("Id");
	var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "AccountAddress"
	});
	esq.addColumn("Account");
	esq.addColumn("AddressType");
	var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Account", accountId);
	var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "AddressType", "0092db56-5b25-4804-a900-ab3b00912832");
	esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
	esq.filters.add("esqFirstFilter", esqFirstFilter);
	esq.filters.add("esqSecondFilter", esqSecondFilter);
	esq.getEntityCollection(function(result) {
		if (result.success) {
			result.collection.each(function(item) {
				item.customStyle = {
				"background": "#ffaf3e"
				};
			});
		}
	}, this);
},

Реализация через вызов сервиса (который возвращает true/false):

prepareResponseCollectionItem: function(item) {
	this.callParent(arguments);
	let accountId = item.get("Id");
	var serviceData = {
		AccountId: accountId
	};
	ServiceHelper.callService("MyService", "MyMethod", function(response) {
		if (response.MyServiceResult === true) {
			item.customStyle = {
				"background": "#ffaf3e"
			};
		}
	}, serviceData, this);
},

 

Оба варианта не успевают выполниться при отрисовке страницы.

Прошу подсказать как можно поменять цвет записи реестре путем обращения в БД, а не относительно колонки обьекта.

 

Спасибо.

Нравится

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

Соловьев Сергей Николаевич,

Добрый день! Есть решение.

Нужно добавить метод, который в реестр подгрузит "виртуальную" колонку с кол-вом "адресов и фильтром по юр.адресу"

			addGridDataColumns: function(esq) {
						this.callParent(arguments);
						this.AccountAdressColumn(esq);
					},
 
					AccountAdressColumn: function(esq) {
						var aggregationColumn = this.Ext.create("Terrasoft.SubQueryColumn", {
							aggregationType: Terrasoft.AggregationType.COUNT,
							columnPath: "[AccountAddress:Account].Id",
							subFilters: this.getFilterGroup()
						});
						if (!esq.columns.contains("HasAddress")) {
							esq.addColumn(aggregationColumn, "HasAddress");
						}
					},
					getFilterGroup: function(){
						var filterGroup = Ext.create("Terrasoft.FilterGroup");
										filterGroup.add("AddressType",
									Terrasoft.createColumnFilterWithParameter(
										Terrasoft.ComparisonType.EQUAL,
										"AddressType",
										"770bf68c-4b6e-df11-b988-001d60e938c6"));
						return filterGroup;
					},
					prepareResponseCollectionItem: function(item) {
						this.callParent(arguments);
						if(item.get("HasAddress")>0) {
							console.log(item.get("Name"));
						}
					},

 

Добрый вечер.

 

Вашу задачу можно реализовать таким образом.

 

1. В таблицу контрагентов добавьте булевское поле 'IsLegalAddressExists', для которого нужно реализовать логику установки значения true, если для контрагента есть хотя бы один юридический адрес, и false, если нет ни одного юридического.

 

2. А в реестре подсветку реализуйте в зависимости от значения нового поля 'IsLegalAddressExists'.

Сергей, добрый день!

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

Добрый день.

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

 

А я хочу реализовать логику, которая будет красить реестр на основании любого условия.

Соловьев Сергей Николаевич,

Не совсем понимаю чем вам не подходят указанные варианты. В приведённом мною примере записи логика успеет выполниться перед отрисовкой страницы. Само же условие можно сделать любым, главное чтобы выполнилось условие true для блока if, где ставиться стиль, хороший пример условия if описала Алла в своём сообщении. Также замечу, что стили не хранятся в БД, поэтому невозможно написать такой к ней запрос, который изменит цвет для записи.

Дима Вовченко,

 

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

 

Для того что выполнить мою бизнес-задачу  с использованием колонки, то нужно добавить (в моем понимании) "костыльную" логику:

1. Добавить колонку в обьект

2. Реализовать логику заполнения и снятия признака с колонки.

Соловьев Сергей Николаевич,

Добрый день! Есть решение.

Нужно добавить метод, который в реестр подгрузит "виртуальную" колонку с кол-вом "адресов и фильтром по юр.адресу"

			addGridDataColumns: function(esq) {
						this.callParent(arguments);
						this.AccountAdressColumn(esq);
					},
 
					AccountAdressColumn: function(esq) {
						var aggregationColumn = this.Ext.create("Terrasoft.SubQueryColumn", {
							aggregationType: Terrasoft.AggregationType.COUNT,
							columnPath: "[AccountAddress:Account].Id",
							subFilters: this.getFilterGroup()
						});
						if (!esq.columns.contains("HasAddress")) {
							esq.addColumn(aggregationColumn, "HasAddress");
						}
					},
					getFilterGroup: function(){
						var filterGroup = Ext.create("Terrasoft.FilterGroup");
										filterGroup.add("AddressType",
									Terrasoft.createColumnFilterWithParameter(
										Terrasoft.ComparisonType.EQUAL,
										"AddressType",
										"770bf68c-4b6e-df11-b988-001d60e938c6"));
						return filterGroup;
					},
					prepareResponseCollectionItem: function(item) {
						this.callParent(arguments);
						if(item.get("HasAddress")>0) {
							console.log(item.get("Name"));
						}
					},

 

Трефилов Павел Сергеевич пишет:

Добрый день! Есть решение.

Нужно добавить метод, который в реестр подгрузит "виртуальную" колонку с кол-вом "адресов и фильтром по юр.адресу"


 
			addGridDataColumns: function(esq) {
						this.callParent(arguments);
						this.AccountAdressColumn(esq);
					},
 
					AccountAdressColumn: function(esq) {
						var aggregationColumn = this.Ext.create("Terrasoft.SubQueryColumn", {
							aggregationType: Terrasoft.AggregationType.COUNT,
							columnPath: "[AccountAddress:Account].Id",
							subFilters: this.getFilterGroup()
						});
						if (!esq.columns.contains("HasAddress")) {
							esq.addColumn(aggregationColumn, "HasAddress");
						}
					},
					getFilterGroup: function(){
						var filterGroup = Ext.create("Terrasoft.FilterGroup");
										filterGroup.add("AddressType",
									Terrasoft.createColumnFilterWithParameter(
										Terrasoft.ComparisonType.EQUAL,
										"AddressType",
										"770bf68c-4b6e-df11-b988-001d60e938c6"));
						return filterGroup;
					},
					prepareResponseCollectionItem: function(item) {
						this.callParent(arguments);
						if(item.get("HasAddress")>0) {
							console.log(item.get("Name"));
						}
					},

Дякую!

Це те що треба! 

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

Доброго дня!



Переход по ссылке к отфильтрованному списку все еще невозможен? Или появились способы реализации данного кейса?

Например, приходит уведомление на почту что зарегистрировано N объектов с каким-то признаком (например, задач на определенного пользователя). И есть кнопка "Перейти к списку задач". Есть необходимость при нажатии на кнопку в письме перейти к перечню записей, в которых поле X равно определенному значению.

Возможно ли как-то формировать url на отфильтрованный перечень?

Нравится

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

Здравствуйте, Вадим!



Правильно понимаю, что при нажатии на "Перейти", у пользователя должна открыться страница авторизации. При вводе параметров для входа, ожидается открытие соответствующего раздела с отфильтрованными записями? Детализируйте задачу.

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

Друзья, подскажите, может кто сталкивался Creatio Studio 7/18/5.

При сохранении БП возникает ошибка 

Error occurred when saving: Method not found: 'Microsoft.CodeAnalysis.SyntaxTree Microsoft.CodeAnalysis.CSharp.CSharpSyntaxTree.ParseText(System.String, Microsoft.CodeAnalysis.CSharp.CSharpParseOptions, System.String, System.Text.Encoding, System.Collections.Immutable.ImmutableDictionary`2, System.Threading.CancellationToken)'.

 

Переустановил Net Core,

NET Framework

Microsoft Visual C++ 2010 Redistributable Package (x64)

Обязательные компоненты все есть.

 

При чем на той же машине развернута 7.17 Bank sales, и с ней все в порядке.

Нравится

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

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

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

В БП есть элемент "Задание-сценарий"? Возможно к ошибке приводит скрипт, который добавлен в этот элемент. Вы можете выгрузить БП (В дизайнере Бизнес процессов -> действия -> экспорт метаданных), для того чтобы мы могли проанализировать данный БП на наличие ошибок.

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

Добрый день!

 

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

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

В Планировании есть возможность расчитать колонку по формуле, но к сожалению, использовать логические операторы нельзя.

 

Коллеги, есть ли опыт реализации подобной задачи? Буду благодарен за подсказку. 

 

Нравится

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

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

 

Вижу описанную реализацию следующим образом:

1. В планировании добавляем колонки План, Факт (с фильтрами из системы), и % выполнения, в котором будем считать значение выполнения плана

2. Создать итог с типом "Шкала" (пример есть в итогах раздела Планирование), который будет показывать значение колонки Факт.

 

Также можно пробовать высчитывать kpi отдельно от планирования, но с аналогичными фильтрами в дашборде.

Роман Казекин,

Добрый день,

 

Роман, правильно ли я Вас понял - план, факт, %выполнения в планировании +  дашборд со шкалой отдельно? А какая будет связь шкалы с разбивкой по типу продукта и менеджеру?

Задорожный Григорий,

Здравствуйте. Верно. Повторюсь, пример есть на любой trial-версии, находится на вкладке "Итоги" в разделе Планирование.

 

Связь задатите в графе "Как группировать", если речь идёт про обычный график.



Если речь идёт про шкалу или показатель, то связь по менеджеру не нужна - у каждого Вашего менеджера есть определённые права, в дашборде он не будет видеть того, на что у него нет прав.



К вопросу по разрезу продуктов - можно попробовать использовать дополнение Calculated Metrics, чтобы разбить процентовку более гибко.



 

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

Добрый день всем

 

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

Unhandled exception. Terrasoft.Common.DublicateDataException: Duplicates data in object "SysCulture".
   at Terrasoft.Core.Entities.Entity.Load(Select select, IDictionary`2 columnMap) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/Entities/Entity.cs:line 2406
   at Terrasoft.Core.Entities.Entity.InternalFetchFromDB(IEnumerable`1 columnsToFetch, IDictionary`2 conditions, Boolean useDisplayValues, Boolean performValuesCleanup) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/Entities/Entity.cs:line 2093
   at Terrasoft.Core.Entities.Entity.FetchFromDB(EntitySchemaColumn conditionColumn, Object conditionValue, Boolean useDisplayValues) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/Entities/Entity.cs:line 3165
   at Terrasoft.Core.Entities.Entity.FetchFromDB(Object keyValue, Boolean useDisplayValues) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/Entities/Entity.cs:line 3223
   at Terrasoft.Core.AppConnection.SetPrimaryCultureInResourceStorage() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/AppConnection.cs:line 705
   at Terrasoft.Core.AppConnection.InitializeCulture() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/AppConnection.cs:line 858
   at Terrasoft.Core.AppConnection.Initialize() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core/AppConnection.cs:line 808
   at Terrasoft.WebHost.Application.OnAfterConfigure() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Application.cs:line 186
   at Terrasoft.WebHost.Startup.Configure(IApplicationBuilder app, IHostEnvironment env, IHostApplicationLifetime applicationLifetime, IApplication application, IAntiforgery antiforgery) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Startup.cs:line 275
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.<UseStartup>b__2(IApplicationBuilder app)
   at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
   at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host)
   at Terrasoft.WebHost.Program.StartWebApplication(String[] args) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Program.cs:line 29
   at Terrasoft.WebHost.Program.<>c__DisplayClass2_0.<Main>b__0(StartOptions _) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Program.cs:line 62
   at CommandLine.ParserResultExtensions.MapResult[T1,T2,TResult](ParserResult`1 result, Func`2 parsedFunc1, Func`2 parsedFunc2, Func`2 notParsedFunc)
   at Terrasoft.WebHost.Program.Main(String[] args) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Program.cs:line 65
Aborted (core dumped)

 

Нравится

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

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

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

Олег Нефедьев,

действительно после полного сноса базы и повторного восстановления ошибка ушла. Спасибо

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

Подскажите, пожалуйста, где прописан код заполнения LeadInQualifyStatus при изменении стадии лида?

Нравится

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

Владимир, 

В приложении реализован отдельный Listener, который отслеживает изменения слушает события сущности - EntityStageHistoryListener (Обработчик событий для записи в журнал перехода по стадиям). В нем существует переопределенный метод onSaved, плюс ряд методов которые отслеживают текущую стадию и её смену.

Реализацию самой смены можно увидеть в классе SaveStageHistoryAsyncOperation (Асинхронная операция записи в журнал перехода по стадиям), который вызывается в EntityStageHistoryListener.

Алёна Доля,

Спасибо большое за ответ!



Правильно ли я понимаю, что 

1) данная функциональность работает только при включенной feature  EntityStageHistoryJournaling?

2) это универсальный метод для любого объекта (в том числе и для пользовательских), только надо где-то прописать настройки. Откуда их читает метод GetStageHistorySetting?

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

Всем привет!

Добавила в бизнес правилах такие условия редактирования поля: 

Изображение удалено.

При наступании на активный рядок в консоли появляется ошибка "Product.UsrBasicPriceExist" была удалена или переименована. Но поле в Продуктах(UsrBasicPriceExist) точно существует. Кто-то пробовал делать что-то подобное в бизнесс правилах? Возможно лучше переписать условие кодом?

Нравится

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

Анастасия, здравствуйте.



Для исправления необходимо включить фичу LoadLookupColumnsInEditGrid, скрипт во вложении.



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

Для редактируемого реестра пока не реализована возможность настройки видимости/доступности/обязательности полей через бизнес правила. 

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



Возможность полноценной работы БП в редактируемых реестрах будет реализована в следующих релизах.

 

Скрипт включения фичи ниже.

 

DECLARE @featureCode varchar(max) = 'LoadLookupColumnsInEditGrid',

 @featureId uniqueidentifier;

set @featureId = (select top 1 Id from Feature where Code = @featureCode);

IF @featureId is null

BEGIN

 insert into Feature

  (Name, Code)

 values

  (@featureCode, @featureCode);

 set @featureId = (select top 1 Id from Feature where Code = @featureCode);

END;

delete from AdminUnitFeatureState where FeatureId = @featureId;

insert into AdminUnitFeatureState

 (SysAdminUnitId, FeatureState, FeatureId)

values

 ('A29A3BA5-4B0D-DE11-9A51-005056C00008', 1, @featureId),

 ('720B771C-E7A7-4F31-9CFB-52CD21C3739F', 1, @featureId);

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

Добрый день!

 

Пытаюсь установить обновления с разработческой среды на тестовую через установку и удаление пакетов.

Сам пакет на целевой стенд устанавливается корректно.

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

Анализируя логи, обнаружила записи типа



.....

2021-12-30 00:47:46,632 Сравнение пакетов

2021-12-30 00:47:46,901 Сохранена схема "SmaNeedSection" в пакете "SmaMain"

..... (тут идут записи про установку пакетов)

2021-12-30 00:47:49,241 Генерация исходного кода схемы "SmaNeedSection" из пакета "SmaMain"

 

В устанавливаемом пакете как раз содержались обновления схемы "SmaNeedSection" и именно их нужно было установить на стенд.

 

Вопрос:

- как происходит сравнение пакетов, что именно при этом сравнивается?

- на основании чего Creatio определяет, что какие-то схемы нужно отдельно сохранить, а потом их восстановить? 

- Что сделать, чтобы избежать таких ошибок в будущем? Если ли какая-то системная настройка, отвечающая за такое поведение установщика пакетов?

Нравится

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

Если распаковать пакет через clio или выгрузить в файловую систему, то у каждой схемы есть файл descriptor.json, в нем есть свойство "ModifiedOnUtc", вот по этой дате, если она отличается, и определяется нужно ли обновить схему на целевой среде или нет. Так же на целевой среде у схем (таблицы в бд) "SysSchema",  "SysPackageSchemaData",  "SysPackageReferenceAssembly ",  "SysPackageSqlScript", должно быть установлено IsChanged =0 и IsLocked =0, где SysPackageId = id вашего пакета (таблица SysPackage)

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

Добрый день!

Добавил свою деталь на страницу Контракты. Сохранил изменения. Перезашел  в приложение, сразу перекидывает на окно Управления конфигурацией и показывает вопрос: "Чтобы продолжить работу в Creatio, необходимо компилировать конфигурацию. Вы хотите скомпилировать сейчас?"

 

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

Подскажите почему так происходит и что делать? Подозреваю, что криво создал деталь, так как это первый опыт.

 

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

 

Нравится

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

Добрый день!

Подскажите, пожалуйста, ваш сайт находится в cloud или on-site?

Если в cloud, то как называется ваш сайт?

Данное поведение наблюдается только у вас или у всех пользователей?

Yanina Ryssjanova,

Добрый день! Сайт находится on-site. Это тестовое приложение, так что я там один нахожусь. Сгенерировал исходный код для всех схем, перекомпилировал все, но при попытки войти, после запроса авторизации снова просит перекомпилировать. И по новой

Ошибка может быть связна с тем, что на сервере, где находится приложение, в момент перезапуска не хватает оперативной памяти, чтобы загрузить конф dll в память. И приложение считает, что конфигурация не проинциниализирована.

Необходимо увеличить мощности сервера.

Yanina Ryssjanova,

 

Боюсь не из-за этого. В пике оперативы задейстовано 18%, ЦПУ 30%. В адресной строке браузера видна ошибка: error=BasePackagesNotInstalled 

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

Или попробуйте через конфигурацию удалить созданную деталь, выполнить генерацию и компиляцию. Будет ли после этого возникать ошибка при входе в приложение?

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

Здравствуйте. Вопрос по коннектору

RabbitMQ connector for Creatio | Creatio Marketplace (terrasoft.ru)

В полях для коннекта присутствует только поле host, но отсутствует поле virtualhost. И никак не удается добиться сигнала "Подключено". У кого-нибудь получалось добиться подключения? Или может сам Алексей подскажет, как можно это сделать? 

Например, в Loyalty поле VirtualHost присутствует.

Нравится

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