我一直在努力解决我们公司遇到的问题。我们使用连接到odoo的prestashop网页。有时,每个平台的订单价格会有所不同(仅美分,但如果差异大于0.03,您将无法通过订单,我们可以更改该数字,但不要)。 我做了一个python程序,为我提供了新值来调整odoo的价格,现在我正在尝试在odoo中实现它,事实证明,说起来容易做起来难。 为了调用该函数,我需要在odoo界面中搜索订单,单击“编辑”并更改一个值(如果两个价格之间的差大于所调用函数的0.03),那么我可以在终端中看到价格可以完美地重新计算(即使该函数被调用太多次,每个订单两次。order_line,也不知道为什么)。那一刻,我可以直接看到ddbb并检查该值是否已实际更改。
问题:单击“保存”按钮时,该函数又被调用,为什么呢?当odoo按顺序重新读取每一行时,它会采用先前的值(仅第一行)并仅修改该值。
>那么,有人知道为什么会这样吗?更重要的是,我如何才能做到这一点,以便odoo读取最后一个值?
我们正在使用odoo 9。 没有错误,只是错误的结果。
我仅附加可能导致问题的代码段。初始函数为amount_all,该函数称为self._price_readjuster_when_different_odooPR(),在该函数中调用了updateLinePrices。
希望一切都清楚易懂
SaleOrder(models.Model)类: _inherit ='sale.order'
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('\n\nvariation_tax: {}\nvariation_total: {}\nVariation: {}\n\n'.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,
})
答案 0 :(得分:0)
我有点解决了。问题是odoo调用该方法的次数远远超出了我的控制范围,可能我应该将代码放在另一个位置,但是由于我不知道该方法的调用方式,所以我只添加了一个按钮即可使用正好。 这个想法是让odoo重新调整价格本身,但问题并不那么频繁。