You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Odoo10中修改发票利润率计算逻辑后触发NameError: global name 'amount_total' is not defined错误的解决咨询

Odoo10中修改发票利润率计算逻辑后触发NameError: global name 'amount_total' is not defined错误的解决咨询

问题分析

你碰到的这个NameError其实很好定位:代码里直接写了amount_total,但它并不是全局变量,而是account.invoice模型自带的字段,必须通过当前的发票记录实例来访问才行。

看你代码里触发错误的这一行:

margin_percentage = (line_margin_amount / amount_total) * 100

这里的amount_total没有绑定到具体的发票对象,Python找不到这个变量,自然就报错了。

修复方案

只需要把amount_total改成record.amount_total就可以解决这个问题——因为循环里的record就是当前处理的发票实例,它包含了amount_total字段的具体值。另外还有个小细节要注意:你最后一行的字符串拼接少了一个闭合的单引号,也得补上。

修正后的关键代码片段:

if line_cost:
    # 通过record实例访问发票的总金额字段
    margin_percentage = (line_margin_amount / record.amount_total) * 100
else:
    margin_percentage = 100

record.margin_amount = line_margin_amount
# 补上缺失的闭合单引号
record.margin_percentage = str(round(margin_percentage,2)) + '%'

额外优化建议

你用了@api.one装饰器,其实不需要再写外层的for record in self:循环——@api.one会自动把self处理成单个记录,这样代码可以更简洁,也符合Odoo的API规范:

@api.one
@api.depends('amount_total','invoice_line_ids','invoice_line_ids.quantity','invoice_line_ids.price_unit', 'invoice_line_ids.discount')
def _get_average_margin_percentage(self):
    sale_price = discount = cost = margin_amount = 0.0
    line_cost = line_margin_amount = margin_percentage = 0.0
    if self.invoice_line_ids:
        for line in self.invoice_line_ids:
            sale_price = line.price_unit * line.quantity
            discount = (sale_price * line.discount)/100
            cost = line.product_id.standard_price * line.quantity
            line_cost += cost
            margin_amount = (sale_price - discount) - cost
            line_margin_amount += margin_amount
        if line_cost:
            margin_percentage = (line_margin_amount / self.amount_total) * 100
        else:
            margin_percentage = 100
        self.margin_amount = line_margin_amount
        self.margin_percentage = str(round(margin_percentage,2)) + '%'

备注:内容来源于stack exchange,提问作者Wimpy

火山引擎 最新活动