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

如何在Odoo16中限制查看move_type为in_invoice的供应商账单报表?

修正后的代码及问题解析

问题分析

原代码存在以下核心错误:

  1. 判断逻辑偏差:未针对当前单据的move_type做校验,反而去检查字段的可选值列表,导致条件始终成立,无法精准控制目标单据。
  2. 报表标识错误:要隐藏的是供应商账单报表(对应标识report_vendor_bill关联的action),但原代码误写为客户发票报表report_customer_invoice。
  3. 视图结构路径错误:表单视图的打印按钮配置在res['toolbar']['print']下,而非res['invoice'],原代码找不到目标操作节点。

修正后的代码

from odoo import models, api

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

    @api.model
    def _get_view(self, view_id=None, view_type='form', toolbar=False, submenu=False, **options):
        res = super()._get_view(view_id, view_type, toolbar, submenu, **options)
        
        # 仅处理account.move的表单视图且需要加载工具栏
        if view_type == 'form' and self._name == 'account.move' and toolbar:
            # 获取当前打开的单据记录ID
            active_id = self.env.context.get('active_id')
            if active_id:
                move_record = self.browse(active_id)
                # 判断当前单据是否为供应商账单
                if move_record.move_type == 'in_invoice':
                    # 过滤打印菜单,移除供应商账单报表按钮
                    if 'print' in res['toolbar']:
                        vendor_report_action = self.env.ref('account.account_print_invoice')
                        res['toolbar']['print'] = [
                            action for action in res['toolbar']['print']
                            if action.get('id') != vendor_report_action.id
                        ]
        return res

补充说明

  • 代码中self.env.ref('account.account_print_invoice')是供应商账单报表对应的系统action引用,若使用自定义报表,需替换为对应action的外部ID。
  • 若需更精细化权限控制,可直接给报表action配置权限组,仅允许指定组用户查看该报表。

内容的提问来源于stack exchange,提问作者Ansu Mary Jacob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:05:15