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
相关产品推荐
相关产品推荐

