Добрый день,

подскажите самый рациональный способ интеграции заказов и товаров интернет-магазина на Ocstore 1.5.4.1 с bpmonline.

На данный момент сложилось впечатление что заказы проще отправлять с помощью Web-To-Object, а вот с товарами нужно покрутиться по odata?

Поделитесь опытом и практическими советами.

Спасибо!

Нравится

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

Готовой интеграции с OpenCart пока нет. Проверяйте в маркете и аналогичном разделе на сайте Ocstore, если кто-то реализует, то появится там.

Различные варианты интеграции описаны в статье «Выбор способа интеграции с bpm'online».

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

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

Подскажите, пожалуйста, как в версии 7.13.0 включить SeparatedJsFiles.

поскольку добавление  в файл внутреннего web.config ключа

не дало результата. 

Спасибо!

 

Нравится

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

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

Либо же после смены настроек нужны ещё перезапуск/чистка Redis/перекомпиляция.

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

Результата нету. Дайте, пожалуйста, ответ на вопрос

См. инструкцию. Без дополнительной информации с Вашей стороны сложно сказать, что не учли.

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

Подробная информация

1) получил бекап

2) Скачал новые исходники на 7.13.0

3) развернул сайт 

 

4) дописал в web.config.

5) всё заработало.

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

задумка хороша, но нет)

Видимо, дописали не то или не там, или же не откомпилировали или не очистили redis после. Без подробной информации сложно сказать.

Плюс есть ещё одна похожая по смыслу опция UseIncludeDependenciesSource, может, вы хотели включить её?

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

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

Добавьте в нужную секцию appSettings.

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

Выше писал, что добавил. 

часть кода с внутреннего конфига

<appSettings>

    <add key="SeparatedJsFiles" value="true" />

    <add key="UseIncludeDependenciesSource" value="false" />

Да, теперь будет раздельно. Не забудьте очистить кэш браузера.

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

Результата нету. Об этом писал 4 сообщения назад. 

Возможно, Вы меняете настройки одного сайта, а смотрите на другом.

yura.makarchuk,

точно в том web.config добавил?

Покажите Коллеги уже человеку в виде скриншота, куда и как добавить и все я думаю будет человеку понятно

Коллеги, человек доходчиво все описал в своём посте, подтверждаю проблему. Ключ не работает в 7.13

Да, Вы с автором темы правы, в 7.12.4 параметр работает, а в 7.13.1 — нет. Предположительно, вернут в 7.13.3.

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

Версия, 7.13.3. Ключ не работает. Подскажите, как можно исправить это, вызывает трудности при разработке.

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

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

Пытаюсь не давать людям закрывать задачи по определенным условиям. Всё хорошо до момента, пока не надо сделать это из esq.

Точнее, функция this.callParent(arguments) никак не работает из

esq.getEntity(Id, function(result) {
    this.callParent(arguments);
}, this);

Уже пробовал сделать var self = this и вызывать от self, пробовал сохранить arguments до esq. Ничего не помогает, задача не сохраняется. 

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

Есть способ?

Нравится

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

Добрый день, нужно либо смотреть в сторону asyncValidate (пример есть в DocumentPageV2), либо переопределить Save.

save: function(config,flag) {
    if (flag) {
        this.callParent(arguments);
    } else {
        //Validation Block
        Terrasoft.chain(
            this.checkPhonesCount,
            function (callback, scope) {
                this.save(config||{}, true),
                    callback.call(scope || this);
            },
            this
        );
    }
 
},
/**
 * Проверка количества телефонов
 * */
checkPhonesCount: function (callback, scope) {
    var leadId = this.get("Id");
    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "UsrLeadPhone"
    });
    esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, "Count");
 
    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
        Terrasoft.ComparisonType.EQUAL, "UsrLead", leadId));
    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
        Terrasoft.ComparisonType.NOT_EQUAL, "UsrPhone", ""));
    esq.filters.addItem(Terrasoft.createColumnIsNotNullFilter("UsrPhone"));
    esq.getEntityCollection(function (response) {
        if (response &amp;&amp; response.success) {
            var collection = response.collection;
            if (collection &amp;&amp; collection.getCount() &gt; 0) {
                var count = collection.getByIndex(0).get("Count");
                if (count &gt;= 1) {
                    callback.call(scope || this);
                    return;
                }
            }
            var msg = this.get("Resources.Strings.PhonesErrorMessage");
            msg = this.Ext.String.format(msg, 1);
            Terrasoft.showInformation(msg);
        }
    }, this);
},

 

Я делаю так: 

1) у кнопки сохранить bind меняю на другую функцию (пр. onBeforeSave)

2) в onBeforeSave реализую логику, а дальше вызываю/не вызываю save-метод

Также можно в save зашить проверку какого-либо параметра. Сохранять arguments, проверять параметр, если false-> вызывать свою функцию, в конце своей функции параметр = true и вызвать save с  сохр. аргументами. Тоже в принципе вариант

Добрый день, нужно либо смотреть в сторону asyncValidate (пример есть в DocumentPageV2), либо переопределить Save.

save: function(config,flag) {
    if (flag) {
        this.callParent(arguments);
    } else {
        //Validation Block
        Terrasoft.chain(
            this.checkPhonesCount,
            function (callback, scope) {
                this.save(config||{}, true),
                    callback.call(scope || this);
            },
            this
        );
    }
 
},
/**
 * Проверка количества телефонов
 * */
checkPhonesCount: function (callback, scope) {
    var leadId = this.get("Id");
    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "UsrLeadPhone"
    });
    esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, "Count");
 
    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
        Terrasoft.ComparisonType.EQUAL, "UsrLead", leadId));
    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
        Terrasoft.ComparisonType.NOT_EQUAL, "UsrPhone", ""));
    esq.filters.addItem(Terrasoft.createColumnIsNotNullFilter("UsrPhone"));
    esq.getEntityCollection(function (response) {
        if (response &amp;&amp; response.success) {
            var collection = response.collection;
            if (collection &amp;&amp; collection.getCount() &gt; 0) {
                var count = collection.getByIndex(0).get("Count");
                if (count &gt;= 1) {
                    callback.call(scope || this);
                    return;
                }
            }
            var msg = this.get("Resources.Strings.PhonesErrorMessage");
            msg = this.Ext.String.format(msg, 1);
            Terrasoft.showInformation(msg);
        }
    }, this);
},

 

Еще можно создать валидатор, который будет делать все проверки и срабатывать перед сохранением записи, его например привязать к полю "состояние"

Вообще, лучше не делать такие проверки только лишь в клиентской логике. Чисто теоретически, пользователь сможет отловить выполнение функции и в отладчике перешагнуть проверку. Хорошо бы и на объекте в обработчике Saving проверять соблюдение условия.

1. Если не вчитываться в смысл задачи, а только подсказать как сделать желаемое то вот этот способ:

save: function() {
   ...
   var args = arguments;
   var parentMethod = this.getParentMethod();
   ....
   esq.GetEntity(function() {
       parentMethod.apply(this, args)
   }, this);
}

2. По смыслу же задачи, вам нужно делать валидацию, а не переопределять методы сохранения. посмотрите примеры в коде с использованием методов addColumnValidator, validate, asyncValidate. 

addColumnValidator, validate делают синхронные проверки. asyncValidate асинхронная валидация, используется когда нужно сделать например запрос в БД для проверки.

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

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

Работаем над кастомным определением прав доступа (доступность полей в зависимости от роли по отношеню к контрагенту). Для этого в AccountLoaded проверяем у пользователя наличие роли по отношению к контрагенту (типа "индивидуальный менеджер", хранится в кастомном объекте, не суть), находим в VwSysEntitySchemaColumnRight доступные роли "индивидуальный менеджер"  поля Account, но они там хранятся только в виде SubjectColumnUId. Для самого же Account доступен список полей через Entity.GetColumnValueNames().

Возникло 2 вопроса:

1. Как эффективно получить список не администрируемых полей чтобы лишний раз их не проверять и не тащить методом исключения?

2. Как имея список SubjectColumnUId эффективно получить названия полей, чтобы скрыть те, на которые у роли нет прав? Через SysPackageSchemaDataColumn или как-то иначе?

 

Нравится

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

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

О компании

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

 

Предпосылки внедрения bpm’online

До внедрения bpm’online сотрудники компании работали в CRM-системе, которая была разработана под определенные задачи клиента и не имела возможности изменения процессов   без партнёрских доработок. Клиент был заинтересован в гибкой системе с возможностью изменения своего бизнес-процесса, которая легко интегрируется с другими системами и дополнениями для возможности реагировать на потребности клиентов и на глобальные изменения в бизнес-процессах.

 

Основные задачи проекта:

  • автоматическое создание и обработка заявок в системе, на основании заказов на сайте клиента;
  • уведомление менеджеров о новом заказе с целью ускорения реакции на потребность клиента;
  • настройка аналитики, которая поможет отследить индивидуальную эффективность менеджеров и работу компании в целом;
  • организация мультиязычности взаимодействия с клиентом: компания Dving.net работает с клиентами по всему миру, поэтому важно отправлять уведомления заказчику на понятном языке с соответствующей валютой.

Для решения этих задач был выбран продукт bpm'online sales.

 

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

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

 

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

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

 

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

 

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

 

Результат

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

 

Нравится

Поделиться

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

Можно ли из скрипта или правила динамически менять названия полей?

Например, называлось моё поле Цена, стало называться Стоимость. Я имею ввиду стандартными средствами, без html хаков?

Нравится

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

Добрый день, да можно, для этого при добавлении поля необходимо реализовать метод, который будет возвращать имя вашей колонки. И свойство Caption забиндить на него, или на какой-то атрибут (смысл тот же)

{

                "operation": "merge",

                "name": "Owner",

                "values": {

                    "caption": {

                        "bindTo": "getDetailCaption"

                    },

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 1,

                        "column": 12,

                        "row": 1

                    }

                }

            }

getDetailCaption: function() {

                var caption = this.get("Resources.Strings.GantDetailCaption");

                return caption;

            },

Добрый день, да можно, для этого при добавлении поля необходимо реализовать метод, который будет возвращать имя вашей колонки. И свойство Caption забиндить на него, или на какой-то атрибут (смысл тот же)

{

                "operation": "merge",

                "name": "Owner",

                "values": {

                    "caption": {

                        "bindTo": "getDetailCaption"

                    },

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 1,

                        "column": 12,

                        "row": 1

                    }

                }

            }

getDetailCaption: function() {

                var caption = this.get("Resources.Strings.GantDetailCaption");

                return caption;

            },

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

При установке пакета возникла ошибка:

"Не удалось загрузить файл на сервер"

Решение темы https://community.terrasoft.ru/questions/ustanovka-paketov-iz-prilozenia не помогло, в чем еще может быть проблема?

Нравится

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

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

Также см. похожие случаи.

Зверев Александр, ЛОГИ пустые, ни одной строчки!

 

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

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

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

Нравится

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

Вы можете через SQL сценарии или если есть доступ к SQL серверу выполнить запрос на разблокировку вашего пакета:

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

UPDATE [Название БД].[dbo].[SysPackage]
    SET InstallType = 0, [IsChanged] = 1, [IsLocked] = 1
    WHERE Name = 'Название пакета'
 
В некоторых случаях может потребоваться еще изменение значения Maintainer на Customer

 

Добрый день, вам через svn перенести бы изменения

Вы можете через SQL сценарии или если есть доступ к SQL серверу выполнить запрос на разблокировку вашего пакета:

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

UPDATE [Название БД].[dbo].[SysPackage]
    SET InstallType = 0, [IsChanged] = 1, [IsLocked] = 1
    WHERE Name = 'Название пакета'
 
В некоторых случаях может потребоваться еще изменение значения Maintainer на Customer

 

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

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

Хочу дополнительно по определенным сложным условиям фильтровать Результат в активности.

Единственным способом мне видится lookupListConfig filters. 

Вопрос - как корректно вызвать родительские фильтры, чтобы не копипастить их в свой код?

Нравится

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

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

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

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

Но так как, к сожалению, это не так, Вам прийдется дублировать родительские фильтры в своем коде sad

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

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

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

Но так как, к сожалению, это не так, Вам прийдется дублировать родительские фильтры в своем коде sad

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

Здравствуйте! Подскажите, как можно реализовать редактор шаблонов для текстовых сообщений(без html). Функционал как у email шаблонов но без изображений, html и прочих не текстовых элементов. Пробовали скопировать отдельно кнопку вставки макроса, а также пытались переделать сам редактор - была идея выключить html режим в ckeditor. Не разобрались как это реализовать, кнопку вставки макросов отдельно скопировать не удалось тк для нее необходимы параметры конфигурации и другие элементы которые зависят от редактора шаблонов email. Требуется только функционал вставки макросов (единственная кнопка из редактора). Текст сообщения допустимо размещать в обычном текстовом поле.

Нравится

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

В существующих дополнениях для отправки SMS есть редактор с макросами, но там в обоих названия полей вводятся вручную.

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

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