如何在Odoo 16的stock.move模型中按标准方式添加分析账户字段
在Odoo 16中为stock.move添加分析账户字段并遵循分析计划标准
Odoo 16的分析账户体系基于**分析计划(Analytic Plans)**实现多维度核算,以下是适配该标准的实现方案,同时兼容你旧版的关联采购订单行逻辑:
1. 字段定义(两种可选方案)
方案1:延续单一分析账户关联(兼容旧逻辑)
继承stock.move模型,添加关联字段并适配分析计划的域限制:
from odoo import fields, models class StockMove(models.Model): _inherit = 'stock.move' analytic_account_id = fields.Many2one( 'account.analytic.account', related='purchase_line_id.account_analytic_id', store=True, string="分析账户", # 仅显示启用的分析计划下的账户 domain="[('plan_id.active', '=', True)]" )
方案2:使用官方推荐的分析分布字段(适配多维度分析计划)
若要完全遵循Odoo 16的分析计划标准,建议使用analytic_distribution(存储多维度分析账户映射的JSON字段):
from odoo import fields, models class StockMove(models.Model): _inherit = 'stock.move' analytic_distribution = fields.Json( related='purchase_line_id.analytic_distribution', store=True, string="分析分布" )
该字段会同步采购订单行上配置的所有分析计划维度信息,支持多维度核算需求。
2. 通过分析计划控制字段必填/可选状态
步骤1:配置分析计划规则
在会计 > 配置 > 分析计划中,编辑目标分析计划,设置必填选项——该配置会控制关联业务对象的分析字段必填性。
步骤2:视图层动态控制字段状态
继承stock.move表单视图,通过attrs属性根据分析计划配置动态设置字段必填性:
<record id="stock_move_form_analytic_inherit" model="ir.ui.view"> <field name="name">stock.move.form.analytic.inherit</field> <field name="model">stock.move</field> <field name="inherit_id" ref="stock.view_move_form"/> <field name="arch" type="xml"> <xpath expr="//field[@name='purchase_line_id']" position="after"> <!-- 单一分析账户字段 --> <field name="analytic_account_id" attrs="{'required': [('purchase_line_id.account_analytic_id.plan_id.required', '=', True)]}"/> <!-- 若使用分析分布字段,替换为: --> <!-- <field name="analytic_distribution" widget="analytic_distribution" attrs="{'required': [('purchase_line_id.analytic_distribution', '!=', {})]}"/> --> </xpath> </field> </record>
这里通过判断采购订单行关联的分析计划是否为必填,自动控制库存移动字段的必填状态。
步骤3:业务逻辑层校验(可选)
如果需要更严格的校验,可在模型方法中添加逻辑:
from odoo.exceptions import UserError def create(self, vals): moves = super().create(vals) for move in moves: plan = move.purchase_line_id.account_analytic_id.plan_id if plan and plan.required and not move.analytic_account_id: raise UserError("当前库存移动关联的分析计划要求必须填写分析账户!") return moves
3. 模块依赖配置
确保你的模块在__manifest__.py中添加必要依赖:
'depends': ['stock', 'account'],
内容的提问来源于stack exchange,提问作者Ameen Nihad
相关产品推荐
相关产品推荐

