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
相关产品推荐
相关产品推荐

