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

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

В объекты [Продукт в заказе] и [Продукт в счете] добавилось вычисляемое поле [Цена со скидкой]. Встала задача перенесения значения этого поля из продукта в заказе в продукт в счете при создании счета на основе заказа. Подскажите, пожалуйста, как это сделать? Заранее благодарю!

Нравится

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

Попробуйте с помощью бизнес процесса, который стартует по сигналу создания счета:
https://academy.terrasoft.ru/documents/technic-bpms/7-8-0/obzor-vozmozh…

Добрый день Дмитрий!!!

перенос продуктов из Заказа в Счет происходит при выполнение бизнес-процесса "CreateInvoiceFromOrder". Если вы Дмитрий добавили новые вычисляемые поля в таблицы продуктов Заказа и Счета и вам требуется их переносить. Тогда мой совет скопировать бизнес-процесс "CreateInvoiceFromOrder" с новым названием и отредактировать элемент бизнес-процесса "Добавить продукты в счет", добавив свои новые созданные поля. После сохранить и опубликовать процесс. Далее вам требуется заместить страницу редактирования OrderPageV2 и добавить в Методы следующий замещающий код: (пример)

     /**
     * Запускает процесс создания счета по заказу.
     * @private
     */
     createInvoice: function() {
          ProcessModuleUtilities.executeProcess({
               sysProcessName: "NewCreateInvoiceFromOrder",
                    parameters: {
                                          CurrentOrder: this.get("Id")
                                     }
          });
     }

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

Благодарю, Михаил! Но данный способ подходит, если счет создается из действия "Создать счет на основании заказа". В нашем случае счет создается со вкладки "Паспорт заказа" с детали "График поставок и оплат": "+"-> 100% предоплата -> "Создать" счет на строке "Полная оплата товара". Как запустить процесс в этом случае?

В этом случае Дмитрий процесс запускать не требуется, а требуется заместить и отредактировать схему "SupplyPaymentDetailV2", метод "getInvoiceInsertQuery". В данном методе происходит создание счета и копирование продуктов из заказа в счет. так же требуется не забыть заместить метод "getSupplyPaymentProductEntitySchemaQuery" и добавить в него свой новые созданные колонки.

"Дмитрий Д." написал:В нашем случае счет создается со вкладки "Паспорт заказа" с детали "График поставок и оплат": "+"-> 100% предоплата -> "Создать" счет на строке "Полная оплата товара". Как запустить процесс в этом случае?

но сдесь нужно не забывать, что счет создается по паспорту заказа. И продукты копируются из паспорта в счет. Я описал именно какие основные методы отвечают за создание счета и копирование продуктов.

Спасибо, Михаил! Действительно, рабочее решение, только вместо метода getInvoiceInsertQuery() правильнее переопределить getInvoiceProductInsertQuery(). Вот что у меня получилось в SupplyPaymentDetailV2:

getSupplyPaymentProductEntitySchemaQuery: function() {
	var esq = this.callParent(arguments);
 
	esq.addColumn("Product.UsrPriceWithDiscount", "UsrPriceWithDiscount");
	return esq;
},
 
getInvoiceProductInsertQuery: function(config, i) {
	var insert = this.callParent(arguments);
 
	var product = config.products.getByIndex(i);
	insert.setParameterValue("UsrPriceWithDiscount", product.get("UsrPriceWithDiscount"), this.Terrasoft.DataValueType.MONEY);	
	return insert;
}

Пожалуйста Дмитрий. Сейчас все получилось, что вы хотели? или еще остались вопросы?

Да, есть еще вопрос. При добавлении к заказу продукта у него автоматически рассчитывается [Сумма], [Сумма налога] и [Итого]. Мне нужно сюда же добавить логику расчета поля [Цена со скидкой]. Где я могу это сделать? Можно, конечно, в методе onEntityInitialized() карточки редактирования OrderProductPageV2, но мне кажется, что этим занимается какой-то бизнес-процесс.

"Дмитрий Д." написал:

Да, есть еще вопрос. При добавлении к заказу продукта у него автоматически рассчитывается [Сумма], [Сумма налога] и [Итого]. Мне нужно сюда же добавить логику расчета поля [Цена со скидкой]. Где я могу это сделать? Можно, конечно, в методе onEntityInitialized() карточки редактирования OrderProductPageV2, но мне кажется, что этим занимается какой-то бизнес-процесс.

Добрый день Дмитрий!!!

Если я правильно вас понял Дмитрий, то речь идет об обновление полей Заказа, после добавления продукта в Заказ, весь расчет перечисленных вами полей происходит в бизнес-процессе схемы таблицы Продукты в заказе ("OrderProduct"), метод "RecalculateOrderAmount".

Если нужно пересчитывать поля в продукте заказа после сохранение заказа, то за это отвечает бизнес-процесс схемы таблицы Заказы метод "SetOrderProductCurrency"

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

Добрый день, Дмитрий!

"Дмитрий Д." написал:не совсем понятно, в какой схеме искать указанный вами метод?

Как выше написал Михаил, в схеме [OrderProduct].
Прикрепил скриншот для наглядности.

У нас в схеме [OrderProduct] нет такого метода, зато он есть в схеме [Order]. Каким образом возможно переопределить и дополнить этот метод в кастомном пакете?

Нужно просто заместить нужный Вам объект (в Вашем случае это [Order]). А уже в замещенном объекте можете переопределять этот метод в зависимости от своих потребностей. Если уже есть замещенный объект в пакете Custom, то просто открыть двойным кликом по методу и переопределить нужным Вам образом.

Давайте еще раз по порядку. Я переопределил схему [OrderProduct], открыл соответствующий ей процесс. Там есть методы UpdatePrimaryAmounts() и RecalculateOrderAmount() (как на скриншоте). Куда я могу вставить логику расчета кастомного поля объекта [OrderProduct], которая должна сработать при создании объекта (то есть при добавлении продукта в заказ)?

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

Дмитрий день добрый!!!

прежде чем замещать любой метод, или те что мы вам рекомендовали. Вы ознакомьтесь с тем кодом, что есть там по умолчанию. Ознакомьтесь как он работает, какой получается результат. И далее уже после ознакомления вставляете свою логику. А вот если не получиться вставить свою логику, тогда милости просим сюда. С примеров того кода что вы написали, и цели и результаты что желаете достичь описываете. И тогда мы вам обязательно поможем.

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