Идея

Идея состоит в том, что бы отбирать конкретный список контактов для рассылки, подгружая к примеру наименования контрагентов в поле фильтра ( Контакт.Контрагент.Наименование ). В фильтре по наименованию реализовать функционал операции "in" ANSI SQL. Имеющийся функционал создаёт новые позиции, а нужно именно организовывать поиск по имеющимся, к примеру просчитанный список нужных контрагентов из другой учётной или аналитической системы из которой загружались контрагенты.

Обсуждение
1 комментарий

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

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

Всем привет!

Прочитал статью по созданию быстрого фильтра в разделе. В статье описывается как создать фильтр по дате и по ответственному, но хотелось бы сделать еще дополнительные фильтры, например по номеру записи или по статусу (справочник). А еще интереснее по связанной записи из справочника. Может у кого есть пример как создать кастомный быстрый фильтр в разделе?

У меня такой же вопрос

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

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

По функциональной части: рекомендую переопределить в Section метод getFilters и там в зависимости от выбранного фильтра в разделе добавлять или удалять фильтры.

По части отображения: добавить свой контейнер в фильтры.

Вот пример для добавления галочки в раздел фильтров:

{
	"operation": "insert",
	"name": "CustomContainer",
	"parentName": "LeftGridUtilsContainer",
	"propertyName": "items",
	"index": 0,
	"values": {
		"id": "CustomContainer",
		"itemType": this.Terrasoft.ViewItemType.CONTAINER,
		"items": []
	}
},
{
	"operation": "insert",
	"name": "CustomFlag",
	"parentName": "CustomContainer",
	"propertyName": "items",
	"values": {
		"caption": {
			"bindTo": "Resources.Strings.CustomFlagCaption"
		},
		"bindTo": "CustomAttribute",
		"controlConfig": {
			"className": "Terrasoft.CheckBoxEdit",
			"checkedchanged": {
				"bindTo": "onCustomFlagChanged"
			}
		}
	}
}

UPD: Точно, ещё для того, чтобы фильтр применялся после изменения фильтра в разделе необходимо в приведённом выше примере в методе onCustomFlagChanged инициировать обновление реестра (this.reloadGridData();).

Так же на момент вызова метода getFilters аттрибут CustomAttribute не изменял своего значения, поэтому был введён новый аттрибут, значение которого менялось так же в методе onCustomFlagChanged.
И, есть вероятность, что придётся помучиться со стилями для того, чтобы фильтр отображался адекватно, при необходимости могу поделиться кодом опять-таки для примера выше.

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

Можно ли каким-то образом построить такой запрос на клиенте:

update KitTrackingInformation
set
    TrackingNumber = @TrackingNumber
from KitTrackingInformation
        join BTSample on BTSample.BTKitIDLookupId = KitTrackingInformation.KitId
            join BTSampInShipment on BTSampInShipment.BTSampleIDId = BTSample.Id
where SampInShipment.BTShipmentId = @ShipmentId

Понятно, что это будет выглядеть приблизительно так:

                    var updateTrackingInfo = Ext.create("Terrasoft.UpdateQuery", {
                        rootSchemaName: "KitTrackingInformation"
                    });
                    updateTrackingInfo.setParameterValue("TrackingNumber", trackingNumber,
                        Terrasoft.DataValueType.SHORT_TEXT);
                                       updateTrackingInfo.filters.addItem(updateTrackingInfo.createColumnFilterWithParameter(
                        this.Terrasoft.ComparisonType.EQUAL,
                        "<путь по связям для фильтрации>", shipmentId));
                    updateTrackingInfo.execute(function(response) {
                        if (response.success) {
                            debugger;
                        }
                    }, this);

Из всего вышеописанного следует 2 вопроса:

1) каким образом построить путь для фильтрации

2) можно ли вообще реализовать UpdateQuery с фильтрацией по полю связанной таблицы

У меня такой же вопрос

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

Алла, скорее всего, такое условие можно получить по обратным связям, когда пишется три поля через двоеточие в квадратных скобках. В этом случае две обратных связи подряд, то есть будет [::].[::].

Вот пример даже тройного join-а:

[SysAdminUnit:Contact:Owner].[SysUserInRole:SysUser:Id].[SysAdminUnit:Id:SysRole].Id

Ещё один:

[SysAdminUnit:Contact].[SysUserInRole:SysUser].SysRole

Сработает ли для update, нужно тестировать, глядя на получающиеся запросы в SQL-профайлере.

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

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

А какие sql-запросы получаются в итоге по этим примерам?

К сожалению, нет возможности посмотреть в профайлере код запросов.

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

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

Доброго времени! 

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

Задача:
1. Поставить фильтр (допустим выдало 100 записей)
2. Нажать "Выбрать все" (показано что выбрано 100)
3. Снять 1 галочку (показано что выбрано 99)
4. Нажать "Изменить ответственного"

Методы:
var selectedRows = this.getSelectedItems();
var selectedRows = this.get("SelectedRows");

Возвращают Id только отображенных записей (29)!

Как получить ожидаемые 99 Id записей?

У меня такой же вопрос

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

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

Когда загружается реестр посылается один запрос (который оптимизирован и загружает не все записи, а 30 – если у вас 100000 записей то не будет накладки по производительности). Когда вы нажимаете «Выбирать все», то не произойдет загрузки всех записей(оптимизация описанная выше), а отправится отдельный запрос который просто вернет количество и обновит название кнопки (при дебаге в network это видно). Чтобы добиться требуемого результата нужно самостоятельно посылать запрос.

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

                    var esq = this.getExportToExcelEsq();
                    esq.rowCount = -1;
                    esq.getEntityCollection(function (response) {...}, this);

Можно посмотреть, как она работает и заменить её своей. Результатом запроса будут все выделенные записи (99 в Вашем случае).

 

Поправка: в 7.12.2 функция, возвращающая запрос, переехала, теперь так:

var esq = this.getGridDataInitializedEsq(true);
esq.rowCount = -1;

...

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

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

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

У меня такой же вопрос

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

Попробуйте использовать встроенные бизнес-процессы объекта "Активности" (подробнее про встроенные бизнес-процессы тут: https://academy.terrasoft.ua/documents/technic-sdk/7-12/primer-ispolzovaniya-vstroennogo-processa-obekta-dobavlenie-avtonumeracii-k-polyu-stranicy, раздел "Алгоритм реализации кейса на стороне сервера").

При создании новой активности с типом E-mail вы можете проверить все нужные поля (есть ли E-mail отправителя у вас в системе, кому письмо предназначено и т.д.), а далее, нужные E-mail с нужными полями отобразить в календаре.

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

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

Проблема в следующем:

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

Оказалось, что при создании такого фильтра, по умолчанию выставляется  условие сравнения "СОДЕРЖИТ", а не  "=" (равно).  

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

Можно ли как-то изменить "условие сравнения по умолчанию" для стандартного фильтра?

Спасибо!

У меня такой же вопрос

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

Добрый день!

Стандартный фильтр действительно работает по принципу "СОДЕРЖИТ". Внести изменения в его условия сравнения возможности нет. 

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

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

Добрый день, Коллеги!
На нескольких проектах столкнулись со следующей ситуацией.
Описания кейса:

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;
}

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

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

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

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

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

У меня такой же вопрос

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

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

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

Выглядеть он будет так: http://prntscr.com/io67sn

Настройка: http://prntscr.com/io689w

"Количество" потом поменять на "Существует", и внутри указать, собственно, фильтр по текущему контакту.

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

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

Помогите пожалуйста отфильтровать справочное поле на клиенте,

У меня есть объект CreditCard у которого есть деталь [залоговое обеспечение] они связаны между собой через колонку  [залоговое обеспечение].CCId(идентификатор кредитной карты).

Так же в объекте [залоговое обеспечение] есть справочное поле [Контакт] собственно именно его я и хочу отфильтровать. Чтобы в нем появлялись только те контакты которые присутствуют в другой детали в CreditCard - CC_TxParticipant(деталь) которые связаны так же как и [залоговое обеспечение] через колонку CCId(идентификатор кредитной карты).

 

В детали CC_TxParticipant есть два справочных поля - 1. Контакт 2. Тип контакта, так вот я не совсем понимаю как сделать так чтобы во время фильтра отсеивались контакты с определенным типом.

 

Сейчас для фильтрации только [Контактов] из CC_TxParticipant я делаю так:

"lookupListConfig": {
"filters": [
function() {
...
var allParticipantsFilter = this.Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[CC_TxParticipant:Participant:Id].CC", master.value);
...
    }
]

где master.value = идентификатор CreditCard, потом добавляю фильтр в общий фильтр и так далее, таким образом я получаю только тех контактов которые присутствуют в детали CC_TxParticipant именно этого CreditCard

-----------------

Попробую объяснить подробнее

Есть следующие объекты:
 

0.[CreditCard] - к нему относятся 2 детали:

1.[CC_TxParticipant] - связана с [CreditCard] через колонку CCId(идентификатор [CreditCard])

2.[CC_CollateralData] - связана с [CreditCard] через колонку CCId(идентификатор [CreditCard])

 

В объекте [CC_TxParticipant] есть справочное поле Контакт, и справочное поле с типом участника.

В объекте [CC_CollateralData] есть справочное поле Контакт которое требуется отфильтровать таким образом, чтобы появлялись только те контакты которые находятся в детали объекта [CC_TxParticipant], кроме тех у которых скажем Тип участника не равен *какой то айди*.

На данный момент у меня получилось только отфильтровать таким образом чтобы отображались только те контакты которые находятся в объекте [CC_TxParticipant] без учета их типа.

master.value  в коде выше как раз является идентификатором [CreditCard]

Понимаю что объяснение получилось запутанное, поэтому заранее прошу прощения

У меня такой же вопрос

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

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

Что бы отсеять контакты по типу нужно добавить фильтр где в качестве сравнения будет конфигурационная константа или id «типа контакта» (таблица ContactType). Например:

filterGroup.add("IsEmployeeType", Terrasoft.createColumnFilterWithParameter(                            Terrasoft.ComparisonType.EQUAL, "Contact.Type", ConfigurationConstants.ContactType.Employee));

При этом нужно не забыть указать зависимость на «ConfigurationConstants»:

define("ContactPageV2", ["ConfigurationConstants"],
function(ConfigurationConstants) {

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

Или же можно сделать запрос используя id из таблицы ContactType:

 filterGroup.add("IsEmployeeType", Terrasoft.createColumnFilterWithParameter(                           Terrasoft.ComparisonType.EQUAL, "Contact.Type",” 806732EE-F36B-1410-A883-16D83CAB0980”));

 

VladKapitanchyk,

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

Сериков Асхат Кайратович пишет:

VladKapitanchyk,

 мой вопрос несколько сложнее

Добрбый день! Если мы не правильно поняли, то просьба переформулировать запрос либо объяснить "на пальцах" . Мы ради будем помочь.

Вильшанский Дмитрий,

Добрый день,

прошу прощения за такой запутанный вопрос, переформулировал, надеюсь получилось

Добрый день.

Спасибо за совет, к сожалению построение обычного фильтра не составляет проблемы

Вам нужно составить фильтр из 2 условий. Т.е. добавить в фильтр группу 2 фильтра(фильтр контактов которые находятся в детали объекта [CC_TxParticipant], и фильтр контактов у которых Тип участника не равен *какой то айди*). На академии можно посмотреть. https://academy.terrasoft.ua/documents/technic-sdk/7-11/primenenie-filt…

VladKapitanchyk,

День добрый,

Разобрался, пытался перемудрить зачем то.

Спасибо большое

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

Помогите сделать фильтр:

Проблема такая: делаю в коде фильтр реестра (показать записи где я ответственный или записи где контрагенты с типом "Дебитор"). Делаю его в initQueryFilters

Все нормально фильтруется.

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

Т.е получается запрос вида owner= 'Иванов'(расширенный фильтр) OR owner = 'Я' OR Тип='Дебитор' . 

В какую сторону копать? В документации ничего не нашел

 

 

 

if(user=='Бизнес менеджер'){
  //esq уже на данном этапе содержит фильтр прилетевший от расширенного фильтра
 
  esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.OR;
 
  //Мои фильтры
  var filterOwner = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"Owner", key);
  sq.filters.addItem("Ответственный по контрагенту",filterOwner);
 
  var filterType = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"Type", tDebt);
  esq.filters.addItem("Тип контрагента",filterType);
 
}

 

У меня такой же вопрос

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

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

Само правило раздачи прав доступа реализовать, например, в бизнес-процессе, а бизнес-процесс запускать при сохранении новой записи или при сохранении существующей, но только в том случае, если менялись значения либо поля 'Ответственный', либо поля "Тип" = "Дебитор".

Войдите или зарегистрируйтесь, чтобы комментировать