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

同模块同视图下,Journal Entry的partner_id字段为空而Vendor Bill已填充的原因?

Odoo落地成本场景下Journal Entry的partner_id字段填充问题解决办法

问题本质

Vendor Bill是account.move中类型为in_invoice的特殊单据,Odoo内置逻辑会自动关联供应商并填充partner标签页的所有字段;但普通Journal Entry(默认类型为entry)没有这套默认填充规则,哪怕用的是同模块同视图,表头partner_id也会是空的。你之前重写_create_account_move_line没用,是因为这个方法负责的是生成分录行数据,和表头的partner字段填充完全无关。

具体解决方案

方案1:视图层面设置动态默认值

如果只需要特定场景下的Journal Entry自动带partner,可以在视图的partner_id字段上绑定默认值方法:

<!-- 在account.move的视图中修改partner_id字段 -->
<field name="partner_id" default="_default_partner_id"/>

然后在account.move模型中实现默认值逻辑:

from odoo import models

class AccountMove(models.Model):
    _inherit = 'account.move'

    def _default_partner_id(self):
        # 示例:从落地成本单据上下文取供应商ID
        landed_cost_id = self.env.context.get('landed_cost_id')
        if landed_cost_id:
            landed_cost = self.env['stock.landed.cost'].browse(landed_cost_id)
            return landed_cost.vendor_id.id
        # 也可以根据日记账类型/日记账ID做判断
        return False

方案2:重写account.move的create方法强制赋值

如果所有用于落地成本的Journal Entry都需要自动填充partner,直接重写create方法:

from odoo import models

class AccountMove(models.Model):
    _inherit = 'account.move'

    def create(self, vals):
        # 判断是否是落地成本相关的日记账(可通过上下文标识或日记账ID判断)
        is_landed_cost_journal = self.env.context.get('is_landed_cost_journal')
        target_journal_id = self.env.ref('your_module.your_landed_cost_journal').id
        if is_landed_cost_journal or vals.get('journal_id') == target_journal_id:
            # 从上下文取预设的partner ID,或者直接关联落地成本的供应商
            vals['partner_id'] = self.env.context.get('landed_cost_partner_id') or vals.get('partner_id')
        return super().create(vals)

方案3:修改落地成本生成日记账的逻辑

直接在落地成本生成Account Move的环节,给生成的日记账设置partner_id:

from odoo import models

class StockLandedCost(models.Model):
    _inherit = 'stock.landed.cost'

    def _create_account_move(self):
        # 先调用原方法生成日记账
        res = super()._create_account_move()
        # 给每个落地成本对应的日记账设置partner
        for cost in self:
            if cost.account_move_id:
                cost.account_move_id.write({'partner_id': cost.vendor_id.id})
        return res

注意事项

  • 区分表头partner_id和分录行partner_id:你的问题是表头标签页字段为空,所以不要去改分录行的生成逻辑;
  • 上下文传递要准确:如果是从落地成本页面跳转生成日记账,记得把供应商ID或落地成本ID传入上下文,确保默认值方法能取到数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:01:28