很多人第一次看 account_loans,会以为它只是“把银行给的摊销表导进来,然后每月自动过账”。但企业版真正要解决的是另一件事:你到底是从零开始建贷款,还是半路接管历史贷款;历史期间是否已经人工入账;贷款提前结清后,后续草稿分录怎么处理。
核心入口:
enterprise/account_loans/models/account_loan.pyenterprise/account_loans/models/account_loan_line.pyenterprise/account_loans/wizard/account_loan_compute_wizard.pyenterprise/account_loans/wizard/account_loan_close_wizard.py
一、贷款并不是只有“导入 Excel”一种起点
企业版提供两条起步路线:
- 上传现成的摊销表,走
action_upload_amortization_schedule(); - 打开
account.loan.compute.wizard,让系统按金额、利率、贷款期限、首付日期和计息方法直接计算计划。
account_loan_compute_wizard.py 里最值得注意的是:它不是只算一个月供数字,而是把以下参数全部显式化:
payment_end_of_month:月底付还是周年日付;compounding_method:30E/360、A/365F、A/A ISDA 等不同计息约定;loan_type:有利率时走 annuity,无利率时走 linear。
这意味着 Odoo 不是把贷款当成“固定模板会计分录”,而是把它当成一个需要金融参数才能展开的期间计划。
二、为什么 skip_until_date 特别重要
account.loan 上的 skip_until_date 很容易被忽略,但它是企业接手存量贷款时最关键的字段之一。
在 action_confirm() 和 _compute_outstanding_balance() 里都能看到它的影响:
- 确认贷款时,早于这个日期的还款行不再生成自动分录;
- 计算 outstanding balance 时,这些已跳过的历史 principal 也会被视为已经处理过。
换句话说,skip_until_date 不是“少生成几笔草稿”这么简单,而是告诉系统:
这部分历史期间,虽然在贷款计划里存在,但会计现实里已经由别的方式入账过了。
如果没有这个字段,很多中途上线企业会面临两种坏结果:
- 要么重复生成历史还本付息与重分类分录;
- 要么账上余额和系统余额永远对不上。
三、确认贷款时,系统一次性生成的不只是 payment move
action_confirm() 里真正生成了三组对象:
- 每期本息支付分录;
- 长期转短期重分类分录;
- 重分类的次月冲回分录。
而且重分类不是笼统按“剩余全部余额”做,而是每个月取未来 12 个月 principal 汇总,生成一笔 LT→ST,再在次月第一天自动冲回。
这说明企业版贷款模块关注的不是“每月付多少钱”而已,还要兼顾报表口径:
- 当月损益里利息怎么进费用;
- 负债里未来一年内到期部分如何转为短期;
- 下个月如何回到可继续滚动计算的状态。
四、提前关闭为什么只是删未来 draft move,而不是重写整张计划
account_loan_close_wizard.py 的 action_save() 非常克制:
- 只删除关闭日期之后、且仍是 draft 的生成分录;
- 把贷款状态改成
closed; - 在 chatter 记一条关闭日志。
它没有试图自动重算“实际提前结清后的新摊销表”,也不会回头重写已经 posted 的历史分录。
这背后的设计非常现实:
- 历史过账是会计事实,不能轻易回写;
- 提前结清往往伴随银行罚息、手续费、人工调整分录;
- 系统负责停掉未来自动化,不替代财务判断剩余结清细节。
五、最容易误解的点
1. “导入计划后金额不对,确认时系统会帮我修正”
不会。action_confirm() 先校验 amount_borrowed_difference、interest_difference、duration_difference,不一致直接报错。Odoo 假设贷款计划必须先自洽,再生成会计动作。
2. “关闭贷款会自动冲销所有未来逻辑”
只会清未来 draft move。已经 posted 的分录,要么保留,要么按正常会计流程冲销,不会因为点了 close 就神奇消失。
3. “Outstanding Balance 等于所有未到期 principal 之和”
也不完全对。源码里它依赖已过账 payment move 和 skip_until_date,所以它反映的是系统认可为已处理后的剩余本金,不是单纯数学剩余表。
六、实战建议
- 存量贷款切入时,先决定要走“导入计划”还是“系统计算”,不要两边混着补。
skip_until_date要和首个自动化月份一起设计,否则最容易重复出历史分录。- 提前结清场景一定要把银行手续费、一次性利息调整与关闭动作分开处理。
- 如果需要和资产组联动,先核对
asset_group_id关系,再谈折旧与贷款联查报表。
七、结论
Odoo 企业版贷款模块的重点不是“帮你记月供”,而是在金融计划、历史接管、自动分录和提前关闭之间维持一致口径。真正难的地方,从来不是导入,而是边界。
DISCUSSION
评论区