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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:35:00