Идея
Обсуждение

Отображение цены в выборе продукта с учетом прайс-листа

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

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

Добрый день, Владимир!

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

Ну, заменить один базовый прайс-лист на другой базовый - это не решение.

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

Владимир, есть у нас рецент решения этого идиотизма. Рассказать?

"Дмитрий Степанов" написал:Владимир, есть у нас рецент решения этого идиотизма. Рассказать?

Конечно, рассказать!

"Дмитрий Степанов" написал:Рассказать?

Ждем :)

Ну ок :) В общем, стандартный функционал bpmonline работает, как известно так:

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

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

Описано на примере заказа, но в принципе должно работать и в фактуре. То, что мы сделали в качестве обходного пути имеет несколько вводных:
1. У нас прайслист задается в лоб в заказе непосредственно. Если нужно задавать в клиенте, то вместо получения значения прайлиста в заказе нужно его из клиента тащить (лучше в заказ, тогда ничего нашего править не придется.
2. При изменении прайса в заказе автоматический перерасчет не осуществляется - правьте руками в позициях :)

Теперь суть изменений:

1. Основным модулем, отвечающим за работу мастера подбора является ProductSelectionViewModel. Чтобы его перестроить как нам надо, создаем замещающий пользовательский модуль, в качестве родителя указываем этот самый ProductSelectionViewModel и копируем туда все целиком из оригинала, включая Dependencies, картинки и строки локализации. Внимание - строки локализации должны быть переименованы в коде, иначе не подтянутся значения строчек. Например, в оригинале было PriceLabel: resources.localizableStrings.PriceCaption, у нас будет PriceLabel: resources.localizableStrings.ChlidPriceCaption, соответственно нужно создать новую строку локализации ChildPriceCaption, скопировать туда из оригинала текст.

2. Нужно загрузить туда заново иконки, их всего две - каталог и корзина. Это просто - сохраните в браузере и потом загрузить в наш модуль.

3. Добавляем в заказ поле "Прайслист" (справочник, прайслист), обязательное.

4. Теперь надо модифицировать код. В частности:
- в функции init: function(config) закомментить строку this.set("BasePriceList", config.BasePriceList);
- присвоение значения this.set("BasePriceList") перетаскиеваем в функцию requestMasterEntityData: function(callback):
добавляем select.addColumn("PriceList");
добавляем this.set("BasePriceList", result.entity.get("PriceList"));

теперь у нас есть значение параметра схемы BasePriceList, который соответствует прайсу в заказе.

дальше переопределяем то, что должно вывестисть в мастере подбора:

- в функции loadGridData: function() переносим строку var basePriceList = this.get("BasePriceList"); над строку this.initQueryColumns(esq, basePriceList.value); в вызов которой добавляем параметр basePriceList.value

- в самой функции initQueryColumns

вставлем новый параметр pricelist в объявление функции:

initQueryColumns: function(esq, pricelist)

комментим вот эти строки:
// esq.addColumn("Price");
// esq.addColumn("Currency");
// esq.addColumn("Tax");

вместо них вставляем
esq.addColumn("[ProductPrice:Product:Id].Price", "Price");
esq.addColumn("[ProductPrice:Product:Id].Currency", "Currency");
esq.addColumn("[ProductPrice:Product:Id].Tax", "Tax");

добвляем фильтр по прайсу (хотим только те продукты, которые имеют этот прайс)

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[ProductPrice:Product:Id].PriceList", pricelist));

функция готова :)

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

Исправляем этот недочет:

- в функции saveSelectedProducts находим фрагмент:

/* if (item.get("PriceList")) {
insert.setParameterValue("PriceList", item.get("PriceList").value, Terrasoft.DataValueType.GUID);
} else if (this.get("BasePriceList")) {
insert.setParameterValue("PriceList", this.get("BasePriceList").value, Terrasoft.DataValueType.GUID);

}*/

и комментим его. Как я понял, у этого куска кода есть неслабая проблема - item.get("PriceList") при сохранении позиции из мастера всегда null, чтобы это побороть пишем "в лоб":

// in the original script there's no pricelist chosen, so we've pushed it from master entity
insert.setParameterValue("PriceList", this.get("BasePriceList").value, Terrasoft.DataValueType.GUID);

В принципе все :) НДС и валюты тоже тянутся, понятное дело.

еще мы от греха добавили basePriceListProductEsq.addColumn("[ProductPrice:Product:Id].PriceList", "PriceList"); //new line, isn't required

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

И последнее - на фактуре (счете) не проверяли, но по идее, если туда тоже вставить поле "Прайс-лист" работать должно.

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

Кто не хочет писать, а хочет готовку - можем обсудить передачу кода :)

Проверили, в счете тоже работает, если поле добавить (как и предполагалось собственно)

Спасибо!

Осталось теперь решить задачу, если у цен есть диапазон действия Valid from - Valid till.
В js это считали для одного продукта. Но если эту же логику засунуть для всех продуктов, то всё повиснет.
А в некий объект (VIEW) дату как параметр не передать в bpm, как я понимаю...

Зачем такие сложности?! :) добавьте в ProductPrice начало (Start) и конец (End), вот этот кусок

добвляем фильтр по прайсу (хотим только те продукты, которые имеют этот прайс)

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[ProductPrice:Product:Id].PriceList", pricelist));

Еще дополнить:

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[ProductPrice:Product:Id].Start", Date));
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[ProductPrice:Product:Id].End", Date));

где Date - текущая дата, a equal поменяйте в соответствии с https://www.bpmonline.com/bpmonlinesdken/Terrasoft.Core~Terrasoft.Core…

Greater Greater than.
GreaterOrEqual Greater than or equal to.
Less Less than.
LessOrEqual Less than or equal to.

Ну и фильтровать у вас надо не по прайсу а по валюте например

"Дмитрий Степанов" написал:Зачем такие сложности?! :)

Приходится. Это не единственная сложность в управлении ценами. В одном проекте часть цен, например, определяется в виде % скидки.

Но в любом случае спасибо за решение!

Я под сложностями имел предложенный способ реализации. Что касается скидки - проект в заказ, прайс подобрать как я написал, процент считать построчно при формировании цены в прайсе, т.е. результат вот этого esq.addColumn("[ProductPrice:Product:Id].Price", "Price"); умножать на процент :)

Дмитрий, а можно ли из модуля вообще выпилить прайс-листы и цену брать из продукта?
Если да, не могли бы вы расписать как это сделать. Модуль подбора я уже заместил, но как безболезненно убрать оттуда прайс-листы пока не понимаю. Заранее спасибо!

А зачем? Из вопроса следует, что у Вас используется одна цена, так? Если так, то цена, заданная на карточке продукта автоматом проставится в базовый прайс-лист. Тогда вообще ничего менять не придется.

Да, цена одна, но продукты импортированы, поэтому автоматически в прайс-лист цена не добавилась.
Нужно это для работы этого модуля в новом разделе. Я уже повторил логику из раздела заказы, после этого модуль в целом работает хорошо, но не выполняет главной задачи, добавления продуктов. При отправке запрос на добавление записей в деталь, вылетает 500 (FormatException), в запросе всё хорошо кроме поля Price, оно в запросе отображается как NaN. Я считаю если выпилить прайсы, то всё должно заработать. При этом в заказах подбор продуктов работает корректно.

понятно. в этом случае я бы вообще делал по другому. Перед началом импорта я бы сотворил процесс, который пихает цену продукта и ндс в таблицу Product Price при сохранении продукта, потом бы его выключил.

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

анализ исходников уже за деньги, прошу отнестись с пониманием :) я же не поддержка :) Хотите - можете прям сейчас показать в скайпе es_ti_di

в том плане, что в скайпе даром посмотрю :)

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

Коллеги, подскажите, пожалуйста, реализовано ли данное пожелание?

Если нет, то планируется ли и на когда?

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