1. Фильтрация лукапа такое же как и в обычной карточке?

Вот такой код:

"UsrLookup2": {
                lookupListConfig: {
                    filter: function() {
                        var filters = new Terrasoft.createFilterGroup();
                        filters.name = "CategoryFilter";
                        filters.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.AND;
                        filters.isEnabled = true;
                        filters.addItem(Terrasoft.createColumnFilterWithParameter(
                            Terrasoft.ComparisonType.NOT_EQUAL, "МоеПоле", ""));
                        //filters.addItem(Terrasoft.createIsNotNullFilter("МоеПоле"));
                        return filters;
                    }
                }
            }

Не срабатывает - в окне выбора остаются записи которые должны были пропасть, кроме того в запросе к БД - нет такого фильтра

2. Можно ли по нажатии на кнопку прорисовать новое поле? нажимать можно неограниченное кол-во раз, создать много полей, задизейблить и потом откривать - не вариант

Нравится

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

Радчук Виталий Владимирович,

По фильтрации лукапа: строчку 

filters.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.AND;
замените на

filters.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;

И уберите вот эту строчку 

filters.isEnabled = true;

И ещё почитайте этот пост.

По второму вопросу смотрите статью на академии.

По фильтрации попробуйте вместо Вашего кода написать таким образом:

"UsrLookup2": {
                lookupListConfig: {
                    filter: function() {
                        var filters = new Terrasoft.createFilterGroup();
                        filters.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.AND;
                        filters.isEnabled = true;
                        filters.add("CategoryFilter", Terrasoft.createColumnFilterWithParameter(
                            Terrasoft.ComparisonType.NOT_EQUAL, "МоеПоле", ""));
                        //filters.addItem(Terrasoft.createIsNotNullFilter("МоеПоле"));
                        return filters;
                    }
                }
            }

 

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

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

По первому - не помогло. Еще заметил, что не могу запустить серверный код! ошибка 500, вот код: 

	var config1 = {
					serviceName: "ShowReport1CService",
					methodName: "CreateReport3",
					callback: function(response) {
						var result = response.CreateReport3Result;
					},
					data: {
					},
					scope: this,
					timeout: 1000000
				};
				ServiceHelper.callService(config1);

и на стороне сервера

[OperationContract]
		[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
		ResponseFormat = WebMessageFormat.Json)]
		public string CreateReport3()
		{
			return "asd";

В чем моя ошибка?

Радчук Виталий Владимирович,

По фильтрации лукапа: строчку 

filters.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.AND;
замените на

filters.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;

И уберите вот эту строчку 

filters.isEnabled = true;

И ещё почитайте этот пост.

По второму вопросу смотрите статью на академии.

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

Коллеги, здравствуйте! Если кто-нибудь сталкивался, то поделитесь, пожалуйста, опытом настройки телефонии Asterisk с помощью коннектора Webitel call manager. Можно ли обойтись без помощи разработчика, и как происходит настройка в интерфейсе bpm’online?

Спасибо!

Нравится

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

Webitel call manager не предназначен для работы с телефонией Asterisk, он служит, внезапно, для работы с телефонией Webitel.

Для работы с Asterisk нужно использовать bpm’online asterisk connector или универсальный Any VoIP connector for bpm’online разработки тех же Webitel.

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

Здравствуйте! Подскажите, а как добавить в фильтры серверного EntitySchemaQuery подзапрос или где в системе можно найти пример? На SQL запрос выглядит следующим образом:

SELECT
   * 
FROM
   [Contract] 
WHERE
   StartDate = (
        SELECT MAX(c.StartDate)
        FROM Premises p
        JOIN PremisesInContract pic ON p.Id = pic.PremisesId
        JOIN Contract c ON spic.ContractId = c.Id
        WHERE p.Id = --@someparameter
   )

 

Нравится

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

Добрый день!



Интересует вопрос:

1) как достать тело письма и "засунуть" его в текстовое поле (как это делает базовые процессы), немного не понимаю процесс (в теле активности текст в html коде)

2) как забирать из письма вложения и добавлять их к вложениям другого объекта?

Нравится

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

Логика создания инцидента по письму реализована в БП IncidentRegistrationFromEmailProcess, его функции RegisterIncidentFromEmail. Там обращаются к вспомогательной схеме IncidentRegistrationFromEmaillHelper. В ней и сделано: функция CreateNewCaseByEmail создаёт запись и наполняет поля, функция ClearHtmlText превращает содержимое тела письма из HTML в текст.

Зверев Александр,

А базовой логики переноса файлов не реализовано?

См. UploadAttachmentsData в ExchangeUtility.

Зверев Александр,

Стартовым сигналом в  БП IncidentRegistrationFromEmailProcess является FinishedSyncSession и если я меняю его на простую активность(письмо) то все рушится. Как в этом плане лучше реализовать регистрацию обращения по письму, не изобретая велосипед. Ведь есть уже практически готовый код, но не могу понять как его переделать.

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

Не могу пронять логику:

- Поступает письмо по имеющемуся обращению

- В активности прикрепляется обращение

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



При этом если я вручную меняю обращение и БП запускается после изменения - все работает как положено.



Вопрос - какой тогда использовать входной сигнал для обработки только что входящей почты с привязанным обращением?

Стандартный БП IncidentRegistrationFromEmailProcess запускается по сигналу «Добавление записи в FinishedSyncSession». Затем Id записей активностей получают из Id сессии при помощи функции GetActivityRecordsId, которая реализована в схеме этого же БП.

Зверев Александр,

Проблема не в том, что я не могу найти активность, а в том что в этой активности БП не видит привязанное обращение. Внешне я вижу, что он определил правильно все. Я могу зайти посмотреть письмо и что оно привязано к нужному обращению. Но сам БП активно игнорирует этот факт.

Значит, на момент срабатывания оно ещё не привязано, а привязка происходит позже, чем отрабатывает Ваша логика.

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

После обновления с 7.12.2 до 7.12.4 начали появляться ошибки в процессе Синхронизировать почту

1:

System.Threading.ThreadAbortException: Thread was being aborted.
   at System.Threading.Monitor.Enter(Object obj)
   at Terrasoft.Core.SchemaManagerProvider.GetManager(String managerName)
   at Terrasoft.Core.MetaDataSerializer.<Deserialize>d__7.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
   at Terrasoft.Core.ServerContentGeneration.RuntimeEntitySchemaCreator.Create(Stream stream, EntitySchemaManager entitySchemaManager)
   at Terrasoft.Core.Entities.EntitySchemaManager.CreateRuntimeEntitySchema(ISchemaManagerItem schemaManagerItem, Assembly assembly)
   at Terrasoft.Core.SchemaManagerItem`1.get_SafeInstance()
   at Terrasoft.Core.Manager`2.FindInstanceByUId(Guid uid)
   at Terrasoft.Core.SchemaProperty.get_ReferenceSchema()
   at Terrasoft.Core.Entities.EntitySchemaColumn.get_ColumnValueName()
   at Terrasoft.Core.Entities.EntitySchemaQuery.CreatePrimaryImageExpression(EntitySchemaColumn schemaColumn, String columnPath)
   at Terrasoft.Core.Entities.EntitySchemaQuery.SetExpressionsForLookup(String columnPath, EntitySchemaQueryColumn queryColumn, EntitySchemaColumn schemaColumn)
   at Terrasoft.Core.Entities.EntitySchemaQuery.CreateColumn(String columnPath)
   at Terrasoft.Core.Entities.EntitySchemaQuery.AddColumn(String columnPath)
   at Terrasoft.Core.Entities.EntitySchema.CreateSelect(UserConnection userConnection, IEnumerable`1 columns, Boolean takeDisplayLookupValues, EntitySchemaColumnMap& columnMap, Boolean useAdminRights, Nullable`1 localizationCultureId)
   at Terrasoft.Core.Entities.Entity.InternalFetchFromDB(IEnumerable`1 columnsToFetch, IDictionary`2 conditions, Boolean useDisplayValues)
   at Terrasoft.Mail.MailSynchronizer.GetMailboxSyncSettings()
   at Terrasoft.Mail.MailSynchronizer..ctor(UserConnection userConnection, MailCredentials credentials, Boolean login)
   at Terrasoft.Core.Process.SyncImapMail.ScriptTask1Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

2:

Terrasoft.Core.InstanceActivationException: Ошибка создания экземпляра класса "Terrasoft.Mail.ISyncStrategy" ---> Ninject.ActivationException: Error activating ISyncStrategy
No matching bindings are available, and the type is not self-bindable.
Activation path:
  1) Request for ISyncStrategy
 
Suggestions:
  1) Ensure that you have defined a binding for ISyncStrategy.
  2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
  3) Ensure you have not accidentally created more than one kernel.
  4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
  5) If you are using automatic module loading, ensure the search path and filters are correct.
 
   at Ninject.KernelBase.Resolve(IRequest request, Boolean handleMissingBindings)
   at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, String name, IParameter[] parameters)
   at Terrasoft.Core.Factories.ClassFactory.GetInstance[T](Func`1 action)
   --- End of inner exception stack trace ---
   at Terrasoft.Core.Factories.ClassFactory.GetInstance[T](Func`1 action)
   at Terrasoft.Mail.MailSynchronizer.SyncImapMail()
   at Terrasoft.Core.Process.SyncImapMail.ScriptTask1Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

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

Нравится

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

Если вы не переделывали базовый функционал никак, то создайте лучше обращение в тех поддержку, так будет лучше.

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

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

Запускаем БП - в нем нужно прописать выгрузку FileStream или byte[] как обычный файл, чтобы после выполнения кода - началась загрузка файла

Нравится

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

Радчук Виталий Владимирович,

Можно.

onSalesDesktopV2: function() {
    var token = "CardModuleV2/UsrAwaitingPageV2";
    this.sandbox.publish("PushHistoryState", {hash: token});
}

 

Точно БП? В таком случае делать аналогично тому, как работает скачивание отчётов. Примерно:

1) Бп генерирует файл, складирует в IDataStore по определённому ключу (допустим генерируется guid). Далее из бп высылается сообщение на клиент с ключом.

2) Клиент принимает сообщение, снова обращается на сервер, но уже за скачиванием.

3) На сервере надо написать класс и функцию, которая будет возвращать стрим с дополнительными header-ами.

Всроде все. Можно вместо БП использовать сервис и тогда просто делать return ключа и не гемороиться с сообщениями.

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

тоесть нет простого пути(

БП мне нужен только для открития преднастроенной страницы, ее из клиента можно както открить?

Радчук Виталий Владимирович,

Можно.

onSalesDesktopV2: function() {
    var token = "CardModuleV2/UsrAwaitingPageV2";
    this.sandbox.publish("PushHistoryState", {hash: token});
}

 

Пащенко Александр Сергеевич,

Дошло руки до этого, хочу убрать бп и вызвать страницу из кода.

"CardModuleV2/UsrAwaitingPageV2" - это точно так как нужно? 

UsrAwaitingPageV2 - название страницы? То что пишет в define.

CardModuleV2 - остается.

Пишет множество ошибок:

Заголовок для подписи "LOOKUPfa02a572-e764-48bf-ad0b-4997972a368f" не был найден.
 
Невозможно найти колонку по конфигурации: "{"layout":{"colSpan":12,"rowSpan":1,"column":12,"row":1,"layoutName":"Header"},"bindTo":"UsrLookup2","enabled":true,"contentType":5,"name":"LOOKUPfa02a572-e764-48bf-ad0b-4997972a368f"}" .
 
Uncaught TypeError: Cannot read property 'header' of undefined
    at i.getPageHeader (:82/0/conf/content/BasePageProcessTemplate.js?hash=9dd7bbf4b00441f59c94ee1b3eae3f45:95)
    at initHeader (:82/0/conf/content/BasePageV2.js?hash=9dd7bbf4b00441f59c94ee1b3eae3f45:2345)
    at i.onEntityInitialized (:82/0/conf/content/BasePageV2.js?hash=9dd7bbf4b00441f59c94ee1b3eae3f45:1680)
    at i.callParent (all-combined.js:6)
    at i.onEntityInitialized (:82/0/conf/content/BasePageV2.js?hash=9dd7bbf4b00441f59c94ee1b3eae3f45:3378)
    at i.callParent (all-combined.js:6)
    at i.onEntityInitialized (:82/0/conf/content/BasePageV2.js?hash=9dd7bbf4b00441f59c94ee1b3eae3f45:3565)
    at Object.callback (all-combined.js:6)
    at i.&lt;anonymous&gt; (all-combined.js:7)
    at Object.Terrasoft.eachAsync (all-combined.js:7)
 
file: http://192.168.10.24:82/0/conf/content/BasePageProcessTemplate.js?hash=9dd7bbf4b00441f59c94ee1b3eae3f45
 line: 95
 column: 24
 message: Uncaught TypeError: Cannot read property 'header' of undefined 
 date: Fri Dec 07 2018 20:17:33 GMT+0300 (Москва, стандартное время)
 stack: TypeError: Cannot read property 'header' of undefined
    at i.getPageHeader (http://192.168.10.24:82/0/conf/content/BasePageProcessTemplate.js?hash=9dd7bbf4b00441f59c94ee1b3eae3f45:95:24)
    at initHeader (http://192.168.10.24:82/0/conf/content/BasePageV2.js?hash=9dd7bbf4b00441f59c94ee1b3eae3f45:2345:85)
    at i.onEntityInitialized (http://192.168.10.24:82/0/conf/content/BasePageV2.js?hash=9dd7bbf4b00441f59c94ee1b3eae3f45:1680:10)
    at i.callParent (http://192.168.10.24:82/core/88fb020650912ad22d23339c297888ad/combined/all-combined.js:6:44657)
    at i.onEntityInitialized (http://192.168.10.24:82/0/conf/content/BasePageV2.js?hash=9dd7bbf4b00441f59c94ee1b3eae3f45:3378:10)
    at i.callParent (http://192.168.10.24:82/core/88fb020650912ad22d23339c297888ad/combined/all-combined.js:6:44657)
    at i.onEntityInitialized (http://192.168.10.24:82/0/conf/content/BasePageV2.js?hash=9dd7bbf4b00441f59c94ee1b3eae3f45:3565:10)
    at Object.callback (http://192.168.10.24:82/core/88fb020650912ad22d23339c297888ad/combined/all-combined.js:6:73147)
    at i.&lt;anonymous&gt; (http://192.168.10.24:82/core/88fb020650912ad22d23339c297888ad/combined/all-combined.js:7:1024268)
    at Object.Terrasoft.eachAsync (http://192.168.10.24:82/core/88fb020650912ad22d23339c297888ad/combined/all-combined.js:7:156660)

 

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

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

Пытаюсь настроить Visual Studio для разработки отдельных модулей исходного кода без перекомпиляции всей структуры как описано в статье https://academy.terrasoft.ru/documents/technic-sdk/7-13/razrabotka-konf…

Настроил всё по инструкции, Debug успешно запускается, но при обращении к свойствам EntitySchemaManager, например, прямо на первой строке примера из статьи:

 var schema = userConnection.EntitySchemaManager.GetInstanceByName("Contact");

получаю ошибку 

Exception: Exception thrown: 
'Terrasoft.Common.ArgumentNullOrEmptyException' in Terrasoft.Common.dll 
("Value for argument "outputDirectory" must be specified."). 

Может кто-то уже сталкивался с подобным? Подскажите что за outputDirectory и где его нужно его указать?

 

Нравится

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

Было похожее,  в ходе тестирования было выявлено, что проблемы возникали из-за параметра:

&lt;add key="Feature-UseRuntimeEntitySchemaMetadata" value="true" /&gt; 

в  Terrasoft.Tools.WorkspaceConsole.exe.config.

При значении false отладка работает.

Зверев Александр,

Спасибо большое! Да, это действительно решает проблему, не знаю сколько времени ушло бы чтобы самому это найти.

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

Коллеги, требуется помощь.

Добавляю в VisualStudio2017 ссылку на сервис /0/ServiceModel/EntityDataService.svc/,ввожу логин и пароль, нажимаю далее - и высвечивается ошибка (рис 0001.1 и 0001). В сообщении выдаётся ссылка на документацию http://odata.github.io/odata.net/#OData-Client-Code-Generation-Tool

Если вводить адрес сервера в строку браузера - то после авторизации отврывается нормальный xml (рис. 0003)

Как поправить ошибку?

Заранее благодарен.

Прикрепленные файлы

Нравится

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

Есть инструкция по созданию прокси-классов, проверьте, может, что-то упустили.

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

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

Коллеги, всем доброго времени суток, нужна помощь.

Необходимо добавить маску загрузки на страницу редактирования.

Пробовал разными способами.

this.showBodyMask();

также пробовал в зависимости карточки добавлять MaskHelper, и далее в коде вызывать MaskHelper.ShowBodyMask() - не срабатывает

 

так же пробовал следующим образом  - var maskId = this.Terrasoft.controls.Mask.show(this);

 так же не работает.

 страница наследуется от Базовая схема карточки ( NUI ).

Ниже приведен код карточки:

define("AbReportSettingsPageV2", ["AbReportSettingsPageV2Resources", "BaseFiltersGenerateModule", "ServiceHelper"], 
	function(Resources, BaseFiltersGenerateModule, ServiceHelper) {
	return {
		entitySchemaName: "AbCustomReport",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
		attributes: {
			"AbDateFrom":{
				"dataValueType": Terrasoft.DataValueType.DATE,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"isRequired": true
			},
			"AbDateBy":{
				"dataValueType": Terrasoft.DataValueType.DATE,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"isRequired": true
			},
			"AbCustomReport": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"isLookup": true,
				"referenceSchemaName":"AbCustomReport",
				"isRequired": true
			},
			"City": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"isLookup": true,
				"referenceSchemaName":"City",
			},
			"Country": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"isLookup": true,
				"referenceSchemaName":"Country",
			},
			"Service": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"isLookup": true,
				"referenceSchemaName":"Product",
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "merge",
				"name": "SaveButton",
				"values": {
					"caption": "$Resources.Strings.AbLoadReportCaption",
					"visible": true
				}
			},
			{
				"operation": "merge",
				"name": "BackButton",
				"values": {
					"visible": true
				}
			},
			{
				"operation": "remove",
				"name": "actions"
			},
			{
				"operation": "remove",
				"name": "Tabs"
			},
			{
				"operation": "remove",
				"name": "PrintButton"
			},
			{
				"operation": "remove",
				"name": "OptionsButtonButton"
			},
			{
				"operation": "insert",
				"name": "AbReportSettingsContainer",
				"parentName": "CardContentContainer",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.CONTAINER,
					"items": [],
					"markerValue": "AbReportSettingsContainer"
				}
			},
			{
				"operation": "insert",
				"name": "AbReportSettingsGridLayoutContainer",
				"parentName": "AbReportSettingsContainer",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
					"items": []
				}
			},
			{
				"operation": "insert",
				"name": "AbDateFrom",
				"values": {
					"layout": {
						"colSpan": 8,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "AbReportSettingsGridLayoutContainer"
					},
					"caption": "$Resources.Strings.AbDateFromCaption",
					"bindTo": "AbDateFrom",
					"enabled": true
				},
				"parentName": "AbReportSettingsGridLayoutContainer",
				"propertyName": "items",
				"index": 0
			},
			{
				"operation": "insert",
				"name": "AbDateBy",
				"values": {
					"layout": {
						"colSpan": 8,
						"rowSpan": 1,
						"column": 0,
						"row": 2,
						"layoutName": "AbReportSettingsGridLayoutContainer"
					},
					"caption": "$Resources.Strings.AbDateByCaption",
					"bindTo": "AbDateBy",
					"enabled": true
				},
				"parentName": "AbReportSettingsGridLayoutContainer",
				"propertyName": "items",
				"index": 1
			},
			{
				"operation": "insert",
				"name": "AbCustomReport",
				"values": {
					"layout": {
						"colSpan": 8,
						"rowSpan": 1,
						"column": 0,
						"row": 4,
						"layoutName": "AbReportSettingsGridLayoutContainer"
					},
					"caption": "$Resources.Strings.AbReportCaption",
					"bindTo": "AbCustomReport",
					"enabled": true,
					"contentType": 3
				},
				"parentName": "AbReportSettingsGridLayoutContainer",
				"propertyName": "items",
				"index": 2
			},
			{
				"operation": "insert",
				"name": "City",
				"values": {
					"layout": {
						"colSpan": 8,
						"rowSpan": 1,
						"column": 8,
						"row": 0,
						"layoutName": "AbReportSettingsGridLayoutContainer"
					},
					"caption": "$Resources.Strings.AbCityCaption",
					"bindTo": "City",
					"enabled": true,
					"contentType": 5
				},
				"parentName": "AbReportSettingsGridLayoutContainer",
				"propertyName": "items",
				"index": 3
			},
			{
				"operation": "insert",
				"name": "Country",
				"values": {
					"layout": {
						"colSpan": 8,
						"rowSpan": 1,
						"column": 8,
						"row": 2,
						"layoutName": "AbReportSettingsGridLayoutContainer"
					},
					"caption": "$Resources.Strings.AbCountryCaption",
					"bindTo": "Country",
					"enabled": true,
					"contentType": 5
				},
				"parentName": "AbReportSettingsGridLayoutContainer",
				"propertyName": "items",
				"index": 4
			},
			{
				"operation": "insert",
				"name": "Service",
				"values": {
					"layout": {
						"colSpan": 8,
						"rowSpan": 1,
						"column": 8,
						"row": 4,
						"layoutName": "AbReportSettingsGridLayoutContainer"
					},
					"caption": "$Resources.Strings.AbServiceCaption",
					"bindTo": "Service",
					"enabled": false,
					"contentType": 5
				},
				"parentName": "AbReportSettingsGridLayoutContainer",
				"propertyName": "items",
				"index": 5
			}
		]/**SCHEMA_DIFF*/,
		methods: {
			onEntityInitialized: function () {
				this.callParent(arguments);
				this.set("Name", this.getHeader());
				this.getCurrentContactCountry();
 
			},
			save: function() {
				this.runReportForming();
			},
			getCurrentContactCountry: function () {
				var currentContactId = Terrasoft.SysValue.CURRENT_USER_CONTACT.value;
				var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
					rootSchemaName: "Contact"
				});
				esq.addColumn("Country", "CountryId");
				esq.getEntity(currentContactId, function(result) {
					if (!result.success) {
						this.showInformationDialog(Resources.localizableStrings.AbCurrentUserCountryError);
						return;
					}
					var country = result.entity.get("CountryId");
					if(country!== null || country!== undefined) {
						this.set("Country", country);
					}
				},this)
			},
			runReportForming: function () {
				var startDate = this.get("AbDateFrom");
				var stopDate = this.get("AbDateBy");
				var report = this.get("AbCustomReport");
				var country = this.get("Country");
				var city = this.get("City");
				var service = this.get("Service");
				if(startDate === null || startDate === undefined) {
					this.showInformationDialog(Resources.localizableStrings.AbFillDateStartCaption);
					return;
				}
				if(stopDate === null || stopDate === undefined) {
					this.showInformationDialog(Resources.localizableStrings.AbFillDateStartCaption);
					return;
				}
				if(startDate > stopDate){
					this.showInformationDialog(Resources.localizableStrings.AbIntervalDateWarningCaption);
					return;
				}
				if(report === null || report === undefined) {
					this.showInformationDialog(Resources.localizableStrings.AbFillReportCaption);
					return;
				}
				if(report.value == "c77af1b5-7118-40c7-8636-870edb85d45f" && (city === null || city === undefined)) {
					this.showInformationDialog(Resources.localizableStrings.AbFiillCityWarningCaption);
					return;
				}
				var reportId = report.value;
				countryId = (country === null || country === undefined) ? null : country.value;
				cityId = (city === null || city === undefined) ? null : city.value;
				serviceId = (service === null || service === undefined) ? null : service.value;
 
				var dateStart = Ext.Date.format(startDate, 'Y-m-d');
				var dateStop = Ext.Date.format(stopDate, 'Y-m-d');
				var dataSend = {
					startDate: dateStart,
					stopDate: dateStop,
					reportId: reportId,
					countryId: countryId,
					cityId: cityId,
					serviceId: serviceId
				};
				this.getReportServices(dataSend);
			},
			getReportServices: function(dataSend) {
				var reportId = dataSend.reportId;
				var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
					rootSchemaName: "AbCustomReport"
				});
				esq.addColumn("Name", "ReportName");
				esq.addColumn("AbSourceCodeServiceName", "SourceCodeServiceName");
				esq.getEntity(reportId, function(result) {
					if (!result.success) {
						this.showInformationDialog("Ошибка запроса данных");
						return;
					}
					var reportName =  result.entity.get("ReportName");
					var sourceCodeName =  result.entity.get("SourceCodeServiceName");
					this.downloadReport(sourceCodeName, reportName, dataSend);
				}, this);
			},
			downloadReport: function(sourceCodeName, reportName, dataSend) {
				debugger;
				this.showBodyMask();
				Terrasoft.AjaxProvider.request({
					url: "../rest/" + sourceCodeName + "/GetReportUrl",
					headers: {
						"Accept": "application/json",
						"Content-Type": "application/json"
					},
					method: "POST",
					jsonData: dataSend,
					callback: function (request, success, response) {
						var responseObject = {};
						if (success) {
							responseObject = Terrasoft.decode(response.responseText);
							var key = "/" + responseObject.GetReportUrlResult;
							var reportCaption = reportName + ".xlsx";
							var report = document.createElement("a");
							report.href = "../rest/" + sourceCodeName + "/GenerateSalaryReport" + key;
							report.download = reportCaption;
							document.body.appendChild(report);
							report.click();
							document.body.removeChild(report);
						}
						this.hideBodyMask();
					}, scope: this
				});
			},
			getHeader: function() {
				return Resources.localizableStrings.AbPageSettingsCaption;
			}
		},
		rules: {},
		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/
	};
});

 

Нравится

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

Добрый день.

Для вызова маски из this необходимо проверить, не потерялся ли контекст где-то по стэку вызова.  При правильном this метод showBodyMask(); должен работать.

Для вызова из MaskHelper необходимо модуль подключить в define.

define("AbReportSettingsPageV2", ["AbReportSettingsPageV2Resources", "BaseFiltersGenerateModule", "ServiceHelper", "MaskHelper"], 
	function(Resources, BaseFiltersGenerateModule, ServiceHelper, MaskHelper) 

В консоли ошибки есть?

Пащенко Александр Сергеевич,

В зависимости MaskHelper добавлял. Во всех трех случаях которые я описал ошибок в консоли нет.

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

попробуйте так:

 

var maskId = Terrasoft.MaskHelper.showBodyMask();

Terrasoft.MaskHelper.hideBodyMask(maskId);

 

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

Страница настроек случайно не в SystemDesigner вставлена?

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

Да, туда.

Есть какие то особенности в данной реализации?

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

Ну как сказать. Я уперся в те же самые проблемы, перепробовал все способы, маска так и не заработала. Убил часа 3, потом просто плюнул на это дело. Только в дизайнере такой бред происходит.

Принял, благодарю. А ТП ничего не говорит по данному поводу?

Cм. пример использования showBodyMask и hideBodyMask. 

Зверев Александр,

Все перепробовал - не работает.

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

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

Добрый день!



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

Как лучше управлять ситуацией, когда первая продажа закончилась неуспешно, а лид вернули на взращивание. И через некоторое время лид отправляется снова на продажу.



В итоге привязка первой продажи к лиду пропадает.

Ваше мнение, как корректнее было бы управлять такими ситуациями?

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

Нравится

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

Я бы предложила при возврате лида - оставить его для истории. А для работы создать новый лид . Ведь если лид не закончился продажей - значит необходимо поменять условия и тактику. Это уже можно назвать новым лидом. Возможно создать "Родительский лид" и связать его со всеми дочерними.

Так можно решить проблему и цитата: "...И в рамках одной потребности можем получать лиды на 10 вебинаров, 5 white page и по другим каналам  Причём, от разных контактов..." Привяжите их к "родителю". для "родительского лида" создайте отчетные поля.

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

О лидах и продажах описано тут.

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

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

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

Можно настроить в разделе фильтрацию, чтобы не видеть не интересующие лиды.

У меня больше идеологические расхождения. 

Что мы взращиваем - потребность (может быть много разных лидов) или конкретную заявку (лид в системе) 

И в рамках одной потребности можем получать лиды на 10 вебинаров, 5 white page и по другим каналам  Причём, от разных контактов.

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

Лидов может быть ещё больше. Если подключена веб-форма регистрации лидов, один и тот же человек может их завести сколько угодно. Но в результате продадут только по одному.

Я бы предложила при возврате лида - оставить его для истории. А для работы создать новый лид . Ведь если лид не закончился продажей - значит необходимо поменять условия и тактику. Это уже можно назвать новым лидом. Возможно создать "Родительский лид" и связать его со всеми дочерними.

Так можно решить проблему и цитата: "...И в рамках одной потребности можем получать лиды на 10 вебинаров, 5 white page и по другим каналам  Причём, от разных контактов..." Привяжите их к "родителю". для "родительского лида" создайте отчетные поля.

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