Вопрос

Есть задача выслать напоминание через 3 рабочих часа. Т.к. использоваться будет много, то хочу сделать по примеру темплейта https://marketplace.terrasoft.ru/template/raschet-rabochih-dney-v-bizne…. Только получается надо к дате/времени события прибавить рабочие минуты с учетом календаря. Если событие произойдет 7 марта в 16:00 (рабочий день до 17:00), то напоминание должно прийти 11 марта в 11:00 (рабочий день с 9:00). Все праздники и сокращенные дни занесены в Типовой календарь.

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

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

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

В продуктах ServiceDesk есть рабочий календарь (график работы) и расчет рабочих дат через веб-сервисы,(посмотрите TermCalculationService и сделайте что вам нужно по аналогии)

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

В продуктах ServiceDesk есть рабочий календарь (график работы) и расчет рабочих дат через веб-сервисы,(посмотрите TermCalculationService и сделайте что вам нужно по аналогии)

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

Решил задачу с использованием класса TermCalculatorActions

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

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

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

Что не так сделал и как же мне перенести этот шаблон письма?

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

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

SysEmailTemplateLcz посмотрите

Поправьте — Тип установки: "Установка".

Поправил. Помогло на 50%. Перенесся только английский вариант письма. А вот на Русском языке нет. Где посмотреть что не так?

SysEmailTemplateLcz посмотрите

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

Спасибо. Наводка помогла. Добавил в данные объект "Таблица локализации для шаблонов" - EmailTemplateLang

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

Добрый день.

Стоит задача: назначать дату начала активности на ближайший день недели указанный в поле Контрагента "День недели" или "День недели 2". Например, у Контрагента в поле "День недели" указан понедельник, а в "День недели 2" - пятница, тогда все новые активности связанные с этим контрагентом должны назначаться на ближайший будущий понедельник или пятницу, в зависимости от того, какая дата ближе..

 

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

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

А в чем конкретно вопрос, что именно не получается реализовать? По логике здесь все просто:
Получаете текущий день недели и сравниваете с ДН1 и ДН2, дальше назначаете дату активности соответствующим днем.

А в чем конкретно вопрос, что именно не получается реализовать? По логике здесь все просто:
Получаете текущий день недели и сравниваете с ДН1 и ДН2, дальше назначаете дату активности соответствующим днем.

Как раз не могу понять как найти дату соответствующую ДН1 или ДН2. Видел функцию ДеньНедели() но он возвращает номер дня

Смотрите номер текущего дня, номера обоих дней контрагента, находите разницу вперёд до ближайшего из двух, если не 0, то добавляете столько дней к сегодняшней дате посредством myDate.AddDays(offset), полученную дату пишете в параметр и используете для создания активности.

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

Есть поле Тип Сервисного договора, оно по умолчанию заполняется из системной настройки, у меня (администратор) это заполнение работает, при добавлении, а у обычного сотрудника - нет. Посмотрел права, не администрируется..
Настройка не кешируется.
Аналогичная настройка Статус системного договора - заполнение работает.

Все из коробки.

Пробовал добавлять в права на операции, группу, у которой не заполняется, и все отработало нормально, но это полный доступ, которого я дать им не могу.
Куда копать?

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

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

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

scr_section_administering_tab_objects.png

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

не работает автозаполнение этого поля из настройки по умолчанию.
Права на изменение объекта и поля и т.д. есть у пользователя. И заполнение из других настроек работает.

Вы же написали что прав нет:

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

Значит, нужно добавить. 

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

Как добавить права, на конкретную настройку? Видимо, только их не хватает.

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

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

У меня стало работать, как нужно, когда я добавил права на операцию "Доступ к разделу Системные настройки". Т.е. дело не в объекте, у которого изменяются поля.

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

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

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

По ссылке - https://community.terrasoft.ua/articles/kak-sdelat-filtraciu-pola-po-ex… - хорошая инструкция как задать фильтр для поиска всех записей объекта Account для которых в объекте AccountCommunication значение колонки SearchNumber равно searchValue.

А можно ли отфильтровать список всех записей объекта Account для которых нет ни одной записи в AccountCommunication?

NOT_EQUAL, createColumnIsNullFilter - не работают, т.к. поиск идёт среди существующих записей, а нужно найти все, кроме тех, которые существуют.

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

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

Смородинов Денис,

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

select *
from Account A
where not exists (select * from AccountCommunication AC
                    where AC.AccountId = A.Id)

Такой запрос можно построить с помощью createNotExistsFilter.

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

а есть примеры использования?

Интересует только клиентская часть, т.е. ESQ-фильтр https://academy.terrasoft.ru/documents/technic-sdk/7-13/rabota-s-filtra…

Примерно так

var esq = this.Ext.create(Terrasoft.EntitySchemaQuery, {
    rootSchemaName: "Activity"
});
esq.addAggregationSchemaColumn("DurationInMinutes", Terrasoft.AggregationType.COUNT, "UniqueActivitiesCount", Terrasoft.AggregationEvalType.DISTINCT);

Подробнее олисано тут

Всё равно до конца не понимаю. Это же расчёт суммы или количества.

Я могу посчитать количество средств коммуникации для конкретного контрагента. Т.е. чтобы отобрать контрагентов, у которых кол-во средств == 0, нужно перебрать значения количества для всех контрагентов по списку?

А если их тысячи?

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

Смородинов Денис,

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

select *
from Account A
where not exists (select * from AccountCommunication AC
                    where AC.AccountId = A.Id)

Такой запрос можно построить с помощью createNotExistsFilter.

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

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

Вопрос такой - в какой момент происходит добавление в список selectedRows при выборе в справочном окне с множественным выбором? Как нибудь можно его перехватить (по сути - какая функция вызывается при клике по строке/отметке чекбокса)?

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

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

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

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

Посмотрите на метод isAnySelected

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

и тем не менее, пожелания клиента.

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

Нужно смотреть в LookupPageViewModelGenerator, который генерирует такую страницу. Случайно не оно?

/**
 * Subscribe to changes selectedRows.
 * @private
 */
_subscribeOnSelectedRowsChange: function() {
	this.on("change:selectedRows", this.onSelectedRowsChange, this);
},
/**
 * Handles selected rows change event.
 */
onSelectedRowsChange: function() {
	if (!this.isMultiSelect()) {
		return;
	}
	let selectedRowsCount = 0;
	if (this.get("SelectAllMode") && this.get("usingMultiAddMixin")) {
		var filteredRowsCount = this.get("filteredRowsCount");
		if (filteredRowsCount) {
var unselectedItems = this.getUnselectedItems();
selectedRowsCount = filteredRowsCount - unselectedItems.length;
		}
	} else {
		selectedRowsCount = this.getSelectedRecords().length;
	}
	this.set("selectedRowsCount", selectedRowsCount);
},

 

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

Добрый день!

Столкнулся с задачей следующего характера:

Имеются 2 детали, по обоим надо посчитать сумму и выдать в печатную форму итоговую сумму. Можно ли это как-то компактно реализовать или только созданием дополнительного поля в которое и будет писаться эта сумма? 

Пример: В первой детали услуги на сумму в 100р, во второй детали материалы на 200р. В итоге, в печатной форме я увижу 300р.

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

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

Быстров Сергей пишет:

Да, верно, вы передаете в макрос параметр по которому хотите найти ваши значения. Делаете 2 выборки, одну из таблицы А и вторую из таблицы Б, суммируете их между собой, а затем result = А + Б;
return result; = это значение вернется в место вызова на самой печатной форме. Могу сбросить примеры

Если делаете в Word, то воспользуйтесь макросами и за 5 минут решите вашу проблему
https://academy.terrasoft.ua/documents/technic-sdk/7-13/kak-sozdat-makr…

Литвинко Павел,

Интересное решение, но текущих примеров недостаточно. Я правильно понимаю, что в моем случае я буду вытаскивать в печатную форму ID обращения (к которому подключены 2 детали), а потом искать в макросе эту самую сумму путем перебора?

Быстров Сергей пишет:

Да, верно, вы передаете в макрос параметр по которому хотите найти ваши значения. Делаете 2 выборки, одну из таблицы А и вторую из таблицы Б, суммируете их между собой, а затем result = А + Б;
return result; = это значение вернется в место вызова на самой печатной форме. Могу сбросить примеры

namespace Terrasoft.Configuration
{
    using System;
    using System.CodeDom.Compiler;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Web;
    using Terrasoft.Common;
    using Terrasoft.Core;
    using Terrasoft.Core.DB;
    using Terrasoft.Core.Entities;
    using Terrasoft.Core.Packages;
    using Terrasoft.Core.Factories;
 
    [ExpressionConverterAttribute("Название макроса по которому будете вызывать его из печатной формы")]
    class CurrentDateConveter : IExpressionConverter
    {
        private UserConnection _userConnection;
 
        public string Evaluate(object value, string arguments = "")
        {
            try
            {
                _userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
                Guid paramId = new Guid(value.ToString());
                return GetAmount(_userConnection, paramId);
            }
            catch (Exception err)
            {
                return err.Message;
            }
        }
        private string GetAmount(UserConnection userConn, Guid value)
        {
            string result = "";
            EntityCollection collection1 = GetEntity(userConn, "Таблица", "Колонка для фильтра", value.ToString());
            EntityCollection collection2 = GetEntity(userConn, "Таблица2", "Колонка для фильтра", value.ToString());
            foreach (var entity in collection1)
            {
               // var recCol1 = Посчитали сумму
            }
            foreach (var entity in collection2)
            {
                // var recCol2 = Посчитали сумму
            }
            result = recCol1 + recCol2;
            return result;
        }
        private EntityCollection GetEntity(UserConnection userConn, string schemaName, string filterColumnName, string filterValue)
        {
            var esq = new EntitySchemaQuery(userConn.EntitySchemaManager, schemaName);
            esq.AddAllSchemaColumns();
            esq.Filters.Add(esq.CreateFilterWithParameters(
                FilterComparisonType.Equal,
                filterColumnName,
                filterValue));
            var entityCollection = esq.GetEntityCollection(userConn);
            return entityCollection;
        }
    }
}

 

Литвинко Павел,

Неловкий вопрос - result  в данном случае строка, а у меня же это сумма. Или я чего-то не понимаю? Да и сумма у меня дробная. 

В итоге получилось вот так:
 

private string GetAmount(UserConnection userConn, Guid value)
{
	EntityCollection collection1 = GetEntity(userConn, "UsrPrice", "UsrWorkObr", value.ToString());
	EntityCollection collection2 = GetEntity(userConn, "UsrMaterialCost", "UsrCase", value.ToString());
	float recCol1 = 0;
	float recCol2 = 0;
	foreach (var entity in collection1)
	{
		recCol1 = float.Parse(entity.GetTypedColumnValue<string>("UsrCostSummVAT")) + recCol1;
	}
	foreach (var entity in collection2)
	{
		recCol2 = float.Parse(entity.GetTypedColumnValue<string>("UsrCostSumm")) + recCol2;
	}
	return (recCol1 + recCol2).ToString("R");
}

 

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


 

О компании

«Мультиплекс Холдинг» — крупнейшая сеть кинотеатров Украины, которая объединяет 22 современных заведения в крупных городах Украины. 121 зал собирает наибольшую зрительскую аудиторию в стране — каждый день проводится 700 сеансов и продается 20000 билетов.

 

Предпосылки внедрения bpmonline

До использования bpmonline обработка обращений была реализована только для внутренних клиентов (сотрудников Multiplex) и осуществлялась в программном продукте Jira, функциональных возможностей которого не хватало для решения всех задач. Обращения от внешних клиентов не обрабатывались с использованием автоматизированных систем.

 

Задачей внедрения bpm'online было внедрить эффективный инструмент обработки обращений как от внутренних клиентов, так и от внешних клиентов. Также компания уже пользовалась продуктом bpmonline marketing, в связи с чем перед командой внедрения стояла глобальная задача построить единую ИТ-экосистему для управления бизнес-процессами.

Выполненные настройки

В ходе реализации проекта в раздел [Сервисы] было добавлены такие отраслевые сервисы как: возврат билетов, демонстрация киноконтента, загрузка кинотеатра, и т.д.

В качестве основного процесса обработки обращений пользователей был взят базовый эталонный процесс.

Для сопровождения основного процесса обработки обращений был создан ряд вспомогательных бизнес-процессов:

  1. Автоматическое назначения ответственного по обращению исходя из заполненного сервиса. Логика процесса заключается в том, чтобы после заполнения сервиса в обращении в справочнике «Сервисный инженер» происходит фильтрация согласно указанного сервиса, если сервис найден, то в карточку обращения подтягивается ответственный. Если нет, то по обращению ответственным указывается первая линия.
  2. Возврат билетов. Логика этого процесса выполняется при создании обращения с контактом «Возврат билетов». В таких условиях происходит автоматическое заполнение соответствующие контакту сервис и ответственный.

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

В процессах обработки обращений в bpm’online заложена логика оценивания уровня удовлетворенности клиента после решения его обращения.  Этот инструмент активно используется сотрудниками для получения обратной связи.

Результат

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

Поделиться

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

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

Сама задача - по кнопке добавлять нужного сотрудника или обучающегося (которого нет). Автоматически он в системе никак не появится, а всего таких людей, из которых можно выбрать, больше 180к. Грузить всех в систему - это как-то много. 

Простой способ 

var config = {
  multiSelect: false,
  entitySchemaName: "UsrContact"
};
this.openLookup(config, this.lookupCallback, this);

приводит к ошибке "Cannot read property 'caption' of undefined"

При этом отдельный запрос к таблице я могу делать, так же как зарегистрировать справочник (в котором все красиво отображается). Но вызвать модальное окно для выбора и поиска по ФИО - не получается.

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

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

Вы наложили вьюху на объект ( подробнее обсуждалось тут ) Проверьте что у  вас выставлено отображаемое поле и опубликуйте схему

Вы наложили вьюху на объект ( подробнее обсуждалось тут ) Проверьте что у  вас выставлено отображаемое поле и опубликуйте схему

Григорий Чех,

Действительно забыл указать "отображаемое значение"

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

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

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

Спасибо!

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

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

Если не путаю Список почтовых ящиков службы поддержки формируется в справочнике “Список почтовых ящиков для регистрации обращений”.

Подробнее тут

Опишите более подробно что вы хотите, не совсем понятно что значит 

оздать несколько почтовых ящиков, из входящих писем

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

Если не путаю Список почтовых ящиков службы поддержки формируется в справочнике “Список почтовых ящиков для регистрации обращений”.

Подробнее тут

Греков Дмитрий Александрович пишет:
Сейчас есть потребность сделать несколько таких ящиков для разных отделов, чтобы обращения так же создавались автоматически из каждого ящика.

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

1) Определение SLA, исходя из ящика, на который получено письмо

2) Распределение прав на обращения и активности, исходя из отдела, который решает данное обращение

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

Спасибо!

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