7.10
sales

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

Версия 7.10.

При создании активности (новой задачи) есть выбор дат начала и завершения:

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

На практике нужно, чтобы некоторые даты были недоступны для выбора (в зависимости от расписания работы сотрудника, т.е. значения колонки "Ответственный" - 2 через 2, или исключить выходные). Условно, можно считать, что есть массив дат, которые необходимо исключить (будет получаться запросом). Либо наоборот - массив доступных дат, исключаются все остальные.

 

Можно ли такой фильтр как-нибудь добавить на колонку календаря?

Нашёл вот такие фильтры для ExtJS Datepicker: https://stackoverflow.com/questions/29251088/disable-date-in-datepicker… но там речь идёт об установке календаря. А тут надо изменить уже установленный, в зависимости от доступных значений.

Спасибо.

Нравится

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

Здравствуйте, у календаря есть еще возможность вводить значение вручную, так что, на вашем месте в качестве валидации, сделал бы просто this.on("change: нужного поля, в котором бы проверял введенную дату, и в случае несоответствия её графику, откатывал бы ее на предыдущее значение, с соответствующим сообщением.

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

В гриде 24 колонки, если размещать чекбоксы последовательно с размерностью 2 колонки, страница идет в разнос. Как решать? Увеличивать не хочу,Изображение удалено. ибо должно и так работать.

Нравится

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

Вангую, что виноваты css-ки. Там какая-то неадекватная ширина для лабела и его контейнер перекрывает соседние элементы при плотном расположении.

Ну да. 2й caption перекрывает контрол первого...

Ну правильно все. Вот и нужно это исправить "в последующих релизах" :)

Добрый день, мы зарегистрировали проблему на команду разработки. В будущих релизах ошибка будет исправлена.

Показать все комментарии
Мобильное приложение
глобальный поиск
7.10
sales

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

Хотел бы узнать, может кто реализовывал похожую задачу глобального поиска контактов и контрагентов в мобильном приложении. Хотелось бы понять, можно реализовать, чтобы поиск в разделе контакты выдавал также и контрагентов с возможностью перехода? Или придётся реализовать отдельную страницу с поиском? Вижу еще проблему общего реестра результатов поиска - открытие в зависимости от типа, соответствующей карточки.

Нравится

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

Здравствуйте, Павел! 

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

Еще одна альтернатива - при идеальной ситуации, когда у каждого контрагента есть хоть 1 контакт, можно попробовать переписать поиск, чтобы в разделе контакты он выбирал не только по полю ФИО но еще и по полю Контрагент.

Здравствуйте, Илья, спасибо за ответ.

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

Terrasoft.sdk.GridPage.setSearchColumns("Contact", ["Name", "Account"]);

 

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

пользователи спрашивают как копировать строки деталей.

из идей как это сделать.

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

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

 

но как сделать так чтобы деталь обновилась после копирования.

Нравится

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

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

Сделайте на детали редактируемый реестр - там уже есть кнопка, которая позволяет скопировать запись. Также в базовой версии на "трех точках" (на действиях детали) уже есть кнопка копирования (см. деталь "Адреса" на странице раздела "Контакты").

Добрый день, Марат! 

Если еще актуально или необходимо для другого кейса - у BasePageV2 есть методы loadDetail и reloadDetail. Также отмечу, что "обновить" деталь можно изменив направление или колонку сортировки.

reloadDetail - идеальный кандидат.

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

Добрый день.

Есть ли в BPM шаблонизатор, что бы отрендерить html-шаблон с имеющимися данными?Например нужен виджет галереи с описанием, куда передам список с урлами изображений. Данный виджет хочу вставить как деталь страницы.

Как это правильно сделать?

Нравится

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

 

правильный ответ на ваш вопрос - Ext.JS (редакции 4.x с некоторыми оговорками)

Разработайте элемент с нуля или наследуясь от той же самой детали.

Стоит упомянуть сразу, что задача эта не тривиальная для типовых кейсов и если у Вас нет навыков работы с этим фреймворком и "внутреннее устройство" BPM для Вас тоже остается не понятым - лучше за подобное даже не приступать. :)

Вам в помощь ранее поднимавшиеся на сообществе темы н/п:

https://community.terrasoft.ru/questions/sozdanie-sobstvennogo-elementa-upravlenia 

https://community.terrasoft.ru/forum/topic/25285#comment-67717

вот пример исходного кода для элемента управления "Кнопка"

https://academy.terrasoft.ua/jscoresdk/source/button.html#Terrasoft-controls-Button

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

Доброго времени суток.

Версия 7.9 sales.

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

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

На всякий случай, переопределения правил из оригинальной версии:

 

rules: {
			"Contact": {
				"FiltrationContactByAccount": {
					"ruleType": 999
				}
			},
		},

methods: {
           setAccount: function(){
            	return false;
            }        
}

Далее, допустим, у нас нет контакта в справочнике, мы хотим добавить контакт. Нажимаем кнопку "Добавить" на всплывающем окне справочника, открывается страница контакта, добавляем контакт. И... контакт не добавляется в колонку.

Как поправить?

Знаю, что есть проблема с версией 7.9 при добавлении новых значений в справочные поля - https://community.terrasoft.ru/forum/topic/25275 - но может ошибку можно исправить проще?

Нравится

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

Можете ввести в карточку контакта для режима создания в методе который обрабатывает состояние "после сохранения" onSaved логику которая опираясь на то "откуда пользователь попал в карточку создания", генерирует сообщение на которое предварительно подпишется ваша карточка обращения, пи получив из него Id созданного контакта установит его в соответствующее поле. Получится как бы имитация штатного поведения (которое не отрабатывает корректно)

...
"onSaved": function(){
      this.callParent(arguments);
      if (this.IsAddMode()){
         //получаем из хеша схему страницы с которой мы попали в карточку создания
         var hashEntityName = sandbox.publish("GetHistoryState").hash.entityName;
         if (hashEntityName == "Схема которая нам нужна"){
             //публикуем событие на которое подписана карточка в которой должно установиться
             //значение созданного контакта 
             this.sandbox.publish(
                "MyCustomEvent",
                //Передаем Id созданного контакта
                this.get("Id"),
                ["MyCustomUniqTag"]
             )
         }
      }
}
...

 

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

Задача модифицировать настройки(расписание) автоматического поиска дублей контактов и контрагентов.

Данный функционал заявлен в пакете Dedupliction, но по факту не работает для контрагентов, всегда выбирается настройка для контактов.

Параметр entitySchemaName в модуле SearchDuplicatesSettingsPageViewModel. При вызове метода generate не заполняется.

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

Создал UsrSearchDuplicatesSettingsSection, наследованный от Базовая схема раздела ( NUI ). В нём в define собственно указал только параметр

entitySchemaName: "DuplicatesSearchParameter".

А для вызова этой страницы в замещённом DuplicatesRuleSectionV2 сделал вызов

openScheduleSettingPage: function() {
  this.sandbox.publish("PushHistoryState", {
    hash: "SectionModuleV2/UsrSearchDuplicatesSettingsSection"
  });
}

В итоге получаю ошибку про name primaryDisplayColumn. Оказывается он не заполняется в getSectionDefaultGridSettings (там цепочка вызова  require) модуля ProfileUtilities.js.

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

Нравится

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

Добрый день, Павел! 

Дело в том, что в это объекте действительно не заполнено данное свойство, он и не создавался для использования в кастомных схемах. Вы указали тег 7.10, но проблема, которая описана в вопросе, была в версии 7.9.1, и исправлена в 7.9.2 - у AccountPageV2  из пакета Deduplication была entitySchemaName : Contact. Подскажите, это тег неверный, или же действительно воспроизводится в 7.10? Если второй вариант, обязательно напишите письмо в официальную поддержку.

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



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

Немного поясню ситуацию. Насколько я выяснил, функционал страницы настройки автоматического поиска дублей контактов и контрагентов реализован в 3-х файлах пакета NUI: SearchDuplicatesSettingsPage, SearchDuplicatesSettingsPageView, SearchDuplicatesSettingsPageViewModel.

Страница SearchDuplicatesSettingsPage вызывается методом openScheduleSettingPage в файле DuplicatesRuleSectionV2.

То есть страница вызывается не со страниц контакта, или контрагента.

Поэтому параметр entitySchemaName не заполняется, что собственно и продемонстрировано:

То есть, насколько я понял, остаётся замещать данные три модуля. Что конечно, будет затруднительно, чтобы поместить на страницу grid с возможностью добавления и удаления строк и придерживаться стилистического оформления.

Да, версия 7.10.2.

Павел, здравствуйте!

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



Если у Вас в 7.10.2 действительно возникают проблемы с тем что выбираются настройки для другого объекта, повторюсь, прошу написать письмо на support@terrasoft.ru с указанием Вашего сайта и данных для доступа.

Показать все комментарии
sales
лендинги
7.x

Возможно ли в Sales Commerce 7.6 настроить лендинги с сайта?

Нравится

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

В базовой версии продукта Sales 7.6 уже реализован данный функционал и присутствует раздел Лендинги.
Он не вынесен в базовое рабочее место "Продажи". Вынести его туда Вы можете в Настройке рабочих мест.

Показать все комментарии
7.4
marketing
on-site
sales
Технические вопросы
7.x

Добрый день!
Задача такая: Необходимо развернуть 7.4.1.391_SalesOmnichannel + 7.4.1.380_Marketing. Каждая из сборок содержит бэкапы БД + сам сайт.
Каким образом это осуществить?
В академии информации по этому вопросу не нашёл.
Могу предположить, что необходимо сначала развернуть 7.4.1.391_SalesOmnichannel и далее средствами WorkspaceConsole выгрузить пакеты из 7.4.1.380_Marketing, но это предположения.
Хотелось бы получить официальную инструкцию.
Заранее спасибо.

Нравится

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

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.

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

Вам необходимо выполнить следующие действия:
1. Развернуть приложение bpm'online sales по стандартной схеме.
2. C помощью утилиты Workspace Console установить пакет MarketingCampaign в базу приложения bpm'online sales (пакет взять из архива релизной сборки bpm'online marketing: Packages/MarketingCampaign.zip)
3. Выполнить вход в приложение под администратором и убедиться в том, что список рабочих мест и разделов отображается корректно.

Здравствуйте. Выполнил, что указано(пакет MarketingCampaign.gz)
при запуске Update.bat Вылезла ошибка об отсутствии пакета Manifest.gz,
добавил Manifest.gz - следующая ошибка пакет Case.gz,
добавил Case.gz - следующая ошибка отсутствие пакета Base.gz.
Пакет Base.gz уже существует в сборке Sales.
Update.bat и логи в прикреплённом архиве

Здравствуйте, Игорь!

Я отписал Сергею по обращению.

Основная суть в том, что на текущий момент прошу попробовать использовать предыдущую версию Sales Omnichannel - 7.4.1.299.

Также приложил инструкцию по обновлению пакетов.

Столкнулся с такой же проблемой. Можно ли получить инструкцию?

Здравствуйте, Александр.

Инструкция была Вам направлена в рамках обращения №0228285.

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

Здравствуйте, Игорь!

Объединение нескольких продуктов - операция, с которой может столкнуться совсем небольшое количество клиентов, потому выкладывать рекомендации в Академию на данном этапе не имеет большого смысла, но я приложу рекомендации ниже.

Ниже пример успешного объединения Sales + Marketing.

Используемые сборки:
- BPMonline_Sales Omnichannel_Softkey_RUS_MSSQL_7.4.1.391
- BPMonline_Marketing_Softkey_RUS_MSSQL_7.4.1.380

Команда WorkspaceConsole:
Terrasoft.Tools.WorkspaceConsole.exe -workspaceName=Default -operation=InstallFromRepository -sourcePath=c:\Temp\Packages -destinationPath=c:\Temp\Destination\ -clearWorkspace=false -continueIfError=true -installPackageData=true -installPackageSqlScript=true -updateDBStructure=true -packageName=MarketingCampaign -skipValidateActions=true -logPath=c:\Temp\WorkspaceConsoleLog\ -webApplicationPath=c:\Sales+Marketing\Sales\

Папку с пакетами формировались следующим образом, учитывая, что сборка делалась на основании Sales и релиз Sales старше, чем Marketing:
1. Скопировать в пустую папку все пакеты и манифест из Marketing.
2. В эту же папку скопировать все пакеты без манифеста из Sales.

Таким образом получилось, что все базовые пакеты брались из более позднего Sales.

Также необходимо добавить следующие блоки в конфигурационные файлы:

[code]
.\Terrasoft.WebApp\ServiceModel\http\services.config
add section:

.\Terrasoft.WebApp\ServiceModel\https\services.config
add section:

.\Terrasoft.WebApp\Web.config
"ServiceModel/MandrillService.svc" append into

add section:

Terrasoft.WebApp\ServiceModel
create file MandrillService.svc
paste text:
<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.MandrillService.MandrillService" %>

[/code]

Нюансы, с которыми можно столкнуться:
1) При установке sql-скрипта «OPP_Tables» может возникнуть ошибка:
Ошибка OPP_Tables: Foreign key 'OPPNonActualEmails_NonActualReasonId' references invalid table 'dbo.NonActualReason'.
Could not create constraint. See previous errors.
Если она возникла, то нужно после того, как отработает консоль, зайти в конфигурацию и вручную установить скрипт.
2) В карточках настроек элементов БП пропадают поля связи с продажей и/или другими сущностями, которые есть в одной вертикали, но нет в другой. В этом случае нужно заместить страницу настроек (старый UI, как в 5х), найти в структуре необходимые поля и снять у них галку "Скрыть".
3) Из коммуникационной панели пропадает кнопка «Визы»:
Это исправляется путем добавления еще одного замещающего клиентского модуля CommunicationPanel, который добавляет (insert) эту кнопку. Код добавления можно скопировать из базового модуля.

Добрый день.
Пытаюсь объединить 7.5.0.1275 BankSales и 7.5.0.870_Marketing
Сделал всё по инструкции от Андрея, но в рабочем месте Маркетинг ничего не изменилось, Компании не добавилось. Может надо чтото сделать еще?

Здравствуйте, Илья!

На данный момент в компании выпуск бандла (2-х и более продуктов) проводит команда продукта, она тестирует его, и уже после отгружает клиенту.
Только в таком случае мы можем гарантировать корректность работы всех составляющих продукта и в случае технических проблем провести быстрые исправления.
В случае самостоятельного склеивания продуктов мы не можем гарантировать корректность работы всех составляющих, так как такая конфигурация даже не была протестирована нашими сотрудниками, и пока не заявлена как релизный продукт.
Только при такой схеме поддержки продукта мы можем гарантировать лучший опыт использования всех возможностей bpm`online.

Спасибо!

Показать все комментарии
sales
справочник
фильрация
Технические вопросы
7.x

Здравствуйте, стоит задача отфильтровать справочник так, чтобы в него не попадали данные, которые уже есть на детали и также отсеивались все контрагенты, у которых тип не равно "наша компания" или "подрядчик".
СТРУКТУРА ДЕТАЛИ подрядчики
Контрагент| Стоимость | Основной

Пробовал 2-мя способами
1) делать запрос в базу, выбирать оттуда все существующие записи на детали и фильтровать по условию NOT_EQUAL.
вторым фильтром накладывать ограничение по типу, затем объединять их в группу,
Здесь проблема в том, что getEntityCollection() выполняется асинхронно и результаты выборки не успевают попасть в группу фильтров.
2) фильтровать по типу, а потом с помощью сообщения получать коллекцию с детали, но здесь также есть свои нюансы.
Во-первых, что будет, если у меня будет много записей на детали, все ли они заберутся при использовании метода getGridData();,
Каким образом мне получить коллекцию при первом открытии страницы и опубликовать сообщение с коллекцией?
ВАРИАНТ 1

 attributes:{

                    "Account": {
                        lookupListConfig: {
                            filter: function() {
                               
                                var filters_res = new Terrasoft.createFilterGroup();
                                filters_res.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.AND;
                                var filters = new Terrasoft.createFilterGroup();
                                filters.name = 'TypeFilter';
                                filters.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.OR;
                                filters.isEnabled = true;
                                filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.EQUAL, 'Type', Constants.Account.AccountType.OurCompany));
                                filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.EQUAL, 'Type', Constants.Account.AccountType.Contractor));

                                var filterGroup = new Terrasoft.createFilterGroup();
                                filterGroup.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.AND;
                                            var addParams = {item1: 'Account', item2: 'PrfService'};
                                            var filterValue = this.get('PrfService').value;
                                            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: this.entitySchemaName
                                            });
                                            esq.addColumn("Id");
                                            esq.addColumn(addParams.item1 + '.Id');
                                            esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
                                            esq.filters.add("filterChild", Terrasoft.createColumnFilterWithParameter(
                                                Terrasoft.ComparisonType.EQUAL, addParams.item2, filterValue));
                                            esq.getEntityCollection(function(result) {
                                                var existsContactsCollection = [];
                                                if (result.success) {
                                                    result.collection.each(function(item) {
                                                        existsContactsCollection.push(item.get(addParams.item1 + '.Id'));
                                                    });
                                                }

                                                if (existsContactsCollection.length > 0) {
                                                    var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsContactsCollection);
                                                    existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;
                                                    existsFilter.Name = "existsFilter";
                                                    //filterGroup.add(filters);
                                                    //filterGroup.add(existsFilter);
                                                    filterGroup.add(existsFilter);
                                                }
                                            });
                                filters_res.add(filterGroup);
                                filters_res.add(filters);
                                return filters_res;
                            }
                        }
                    }
            },

ВАРИАНТ 2
.....
 this.sandbox.subscribe('ContractorCollectionMessage',
                        function(params)  {
                            this.set("ExistsCollection", params.existsCollection);
                        },
                        this
                    );
.......
 attributes:{

                "Account": {
                    lookupListConfig: {
                        filter: function() {
                            var existsCollection=this.get("existsCollection");
                            //фильтр по нашей компании и подрбядчику
                            var filters = new Terrasoft.createFilterGroup();
                            filters.name = 'TypeFilter';
                            filters.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.OR;
                            filters.isEnabled = true;
                            filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                Terrasoft.ComparisonType.EQUAL, 'Type', Constants.Account.AccountType.OurCompany));
                            filters.addItem(Terrasoft.createColumnFilterWithParameter(
                                Terrasoft.ComparisonType.EQUAL, 'Type', Constants.Account.AccountType.Contractor));
                            //общий фильтр
                            var filterGroup = new Terrasoft.createFilterGroup();
                            filterGroup.logicalOperation = Terrasoft.core.enums.LogicalOperatorType.AND;
                            //добавляем фильтр по типу контрагента
                            filterGroup.add(filters);
                            if (typeof (existsCollection)!=undefined && existsCollection.length > 0) {
                                var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsCollection);
                                existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;
                                existsFilter.Name = "existsFilter";
                                //фильтр по имеющимся на детали записям
                                filterGroup.add(existsFilter);
                            }
                            return filterGroup;
                        }
                    }
                }

Нравится

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

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.

Александр, здравствуйте.

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

Здравствуйте, задача ещё актуальна. Заранее спасибо за помощь.

Александр, здравствуйте!
Вы можете строить Exist-фильтры прямо в ESQ без выполнения дополнительных запросов. Посмотрите статью http://www.terrasoft.ru/bpmonlinesdk/UsingEntitySchemaQuery.html (в самом конце).

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