#python #odoo
#python #odoo
Вопрос:
Я пытался решить проблему, с которой мы столкнулись в моей компании. Мы используем веб-страницу prestashop, которая подключена к odoo. Иногда каждая платформа получает разную цену в заказах (всего центы, но вы не можете передать заказ, если разница больше 0,03, мы можем изменить это число, но не хотим). Я создал программу на python, которая предоставила мне новые значения для корректировки цен в odoo, и теперь я пытаюсь реализовать это в odoo, оказывается, это легче сказать, чем сделать. Чтобы вызвать функцию, мне нужно выполнить поиск заказа в интерфейсе odoo, нажать Редактировать и изменить значение (если разница между обеими ценами больше 0,03 для вызываемой функции), тогда я вижу в терминале, что цены пересчитаны идеально (хотя функция вызывается слишком много раз, дважды за order.order_line, не знаю почему). В этот момент я могу напрямую просмотреть ddbb и проверить, действительно ли значение было изменено.
Проблема: при нажатии кнопки сохранить функция вызывается еще раз, почему?, когда odoo перечитывает каждую строку в порядке, он принимает предыдущее значение (только первую строку) и продолжает изменять только это значение.
Итак, кто-нибудь знает, почему это происходит? и, что более важно, как я мог бы сделать так, чтобы odoo считывал последнее значение?
мы используем odoo 9. Ошибок нет, просто неправильные результаты.
Я прикрепляю только те фрагменты кода, которые могут быть причиной проблемы. Начальная функция — amount_all, она вызывает self._price_readjuster_when_different_odooPR(), внутри этой функции вызывается updatingLinePrices.
Надеюсь, все понятно
класс SaleOrder (модели.Модель): _inherit = ‘продажа.заказ’
def updatingLinePrices(self, order, price_adjusted):
## Updates the new price for each product
for line, newPrice in zip(order.order_line, price_adjusted):
#import pdb; pdb.set_trace()
try:
if order.order_line.search([['id', '=', line.id], ['name', '=', '[DISCOUNT] Cupon de Descuento']]).id == False:
#56 => 10%
tax = 1.1 if str(line.tax_id.id) == 56 else 1.21 #
if not self.env.context.get('line'):
line.with_context(line=True).write({
"price_subtotal": newPrice * line.product_uom_qty,
"price_unit": newPrice,
"price_tax": (newPrice*tax)-newPrice,
"price_total": newPrice*tax,
"price_reduce": newPrice,
})
except Exception as e:
print("Error updating to new prices: {}".format(e))
return line
@api.depends('order_line.price_total')
def _amount_all(self):
"""
Overrides method to calculate amount_tax over price_tax ignoring tax calculation method.
"""
#print("_amount_all function has been called")
for order in self:
amount_total = amount_untaxed = amount_tax = 0.0
for line in order.order_line:
amount_untaxed = line.price_subtotal
amount_tax = line.price_tax
amount_total = amount_untaxed amount_tax
if self.prestashop_bind_ids.total_amount_tax and self.prestashop_bind_ids.total_amount:
variation_in_tax = abs(self.prestashop_bind_ids.total_amount_tax - amount_tax)
variation_in_total = abs(self.prestashop_bind_ids.total_amount - amount_total)
variation = variation_in_tax variation_in_total
print('nnvariation_tax: {}nvariation_total: {}nVariation: {}nn'.format( variation_in_tax, variation_in_total, variation))
if variation >= 0.03 and variation_in_tax >= 0.03 or variation_in_total > 0.03:
self._price_readjuster_when_different_odooPR()
order.update({
'amount_untaxed': order.pricelist_id.currency_id.round(amount_untaxed),
'amount_tax': order.pricelist_id.currency_id.round(amount_tax),
'amount_total': amount_total,
})
Комментарии:
1. ups, заголовок — how. lol
2. Вы используете значения с плавающей запятой для обработки валюты. Используйте десятичные дроби.
3. @DanD. легко сделать при использовании фреймворка … не
4. Я действительно мог бы перейти на десятичное число, но это не решит проблему.
Ответ №1:
Я вроде как решил это. Проблема в том, что odoo вызывает метод гораздо чаще, чем я могу контролировать, вероятно, мне следовало поместить код в другое место, но поскольку я не знаю, как этот метод вызывается, я просто добавил кнопку, и она работает просто отлично. Идея заключалась в том, чтобы odoo сам скорректировал цену, но проблема в любом случае возникает не так часто.