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

Odoo v17餐饮POS多员工会话:按收银员权限控制发票按钮显隐

Odoo v17 POS 单会话多员工场景下按收银员权限控制发票按钮显示

核心思路

替换原逻辑中依赖系统登录用户的权限判断,改为基于POS当前会话绑定的收银员信息,通过检查其所属权限组,控制支付页面发票按钮的显示/隐藏。

具体实现步骤

1. 获取当前POS会话的收银员

在POS前端环境中,直接通过this.pos.get_session().cashier获取当前会话绑定的收银员对象,该对象包含收银员ID、权限组等核心数据。

2. 调整权限组判断逻辑

先确认系统中基础/高级权限组的XML ID(默认Odoo POS基础组为point_of_sale.group_pos_user,高级组为point_of_sale.group_pos_manager,自定义组需替换为对应ID),再编写判断逻辑:

// 获取当前会话收银员
const sessionCashier = this.pos.get_session().cashier;
// 将权限组XML ID转换为数据库ID
const baseGroupId = this.pos.env['ir.model.data'].xmlid_to_res_id('point_of_sale.group_pos_user');
const advancedGroupId = this.pos.env['ir.model.data'].xmlid_to_res_id('point_of_sale.group_pos_manager');

// 判断收银员是否属于高级权限组
const hasInvoicePermission = sessionCashier.groups_id.includes(advancedGroupId);
// 控制按钮显示状态:仅高级组可见
this.invoiceButtonVisible = hasInvoicePermission;

3. 控制支付页面发票按钮显示

找到POS支付页面中控制发票按钮的代码位置,替换原有的系统登录用户判断逻辑:

模板端控制(XML示例)

如果按钮显示由模板条件控制:

<button t-if="widget.invoiceButtonVisible" name="create_invoice" string="发票" class="btn btn-secondary"/>

前端组件控制(JS示例)

如果在组件渲染逻辑中控制:

// 在支付组件的render/refresh方法中更新按钮状态
this.renderElement();
this.$('.invoice-button').toggle(this.invoiceButtonVisible);

4. 后端字段扩展(可选)

若POS前端无法获取收银员的groups_id字段,需扩展pos.session模型,确保会话数据加载时携带收银员权限组信息:

from odoo import models

class PosSession(models.Model):
    _inherit = 'pos.session'

    def _pos_ui_fields(self, config_id):
        fields = super()._pos_ui_fields(config_id)
        # 给收银员字段添加权限组信息
        if 'cashier' in fields:
            fields['cashier'].append('groups_id')
        return fields

注意事项

  • 若使用自定义权限组,需替换代码中的XML ID为系统实际对应值
  • 测试时切换不同权限组的收银员登录同一POS会话,验证按钮显示逻辑是否生效
  • 基于第三方POS模块开发时,需确保代码扩展的是正确的组件和模型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:40:02