You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo批量导入发票后货币计算错误,如何批量修正?

Odoo批量修复发票货币计算问题解决方案

问题本质

发票币种已设置为USD,但系统仍按MXN计算总额,手动切换币种再切回能触发正确计算——核心是手动操作完整触发了Odoo的字段变更检测、关联计算及数据持久化流程,而你原代码直接调用_onchange_currency()和_compute_amount(),未模拟完整的字段更新与保存逻辑,所以无效。

可行解决方案

方案1:完全模拟手动切换币种逻辑

直接复现“改MXN→保存→改回USD→保存”的手动操作,完整触发系统内置的计算流程:

# 替换为你系统中实际的MXN和USD币种ID
MXN_CURRENCY_ID = 33
USD_CURRENCY_ID = 2

# 批量切换到MXN
records.write({'currency_id': MXN_CURRENCY_ID})
# 批量切换回USD
records.write({'currency_id': USD_CURRENCY_ID})

如果担心批量操作触发的计算压力过大,可分批次处理:

MXN_CURRENCY_ID = 33
USD_CURRENCY_ID = 2
batch_size = 500

for i in range(0, len(records), batch_size):
    batch = records[i:i+batch_size]
    batch.write({'currency_id': MXN_CURRENCY_ID})
    batch.write({'currency_id': USD_CURRENCY_ID})

方案2:直接触发完整金额计算流程

若不想切换币种,可强制标记币种字段为已修改,触发关联计算后保存结果:

for invoice in records:
    # 标记币种字段为已修改,触发依赖计算逻辑
    invoice._cache['currency_id'] = invoice.currency_id.id
    # 执行币种变更的onchange逻辑
    invoice._onchange_currency()
    # 强制重新计算所有金额字段
    invoice._compute_amount()
    # 保存更新后的金额数据
    invoice.write({
        'amount_untaxed': invoice.amount_untaxed,
        'amount_tax': invoice.amount_tax,
        'amount_total': invoice.amount_total
    })

关键注意事项

  • 数据备份:批量操作前务必备份数据库,避免操作失误导致数据异常。
  • 权限验证:确保执行服务器动作的用户拥有发票修改权限,必要时在代码开头添加invoice = invoice.sudo()提升权限。
  • 测试先行:先选取1-2张异常发票测试代码,确认生效后再批量执行。

内容的提问来源于stack exchange,提问作者Legna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:15:30