first commit

This commit is contained in:
Suherdy Yacob 2026-03-12 14:39:39 +07:00
commit 1616f6735e
10 changed files with 120 additions and 0 deletions

1
__init__.py Normal file
View File

@ -0,0 +1 @@
from . import models

24
__manifest__.py Normal file
View File

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
{
'name': 'POS Employee Role',
'version': '1.0',
'category': 'Sales/Point of Sale',
'summary': 'Add roles to employees for POS permissions',
'description': """
This module adds a role to employees for Point of Sale.
Roles: Waiter/Server, Cashier, Outlet Manager, Area Manager.
These roles are used to restrict POS UI features dynamically.
""",
'depends': ['point_of_sale', 'pos_hr'],
'data': [
'views/hr_employee_views.xml',
],
'assets': {
'point_of_sale._assets_pos': [
'pos_employee_role/static/src/app/**/*',
],
},
'installable': True,
'application': False,
'license': 'LGPL-3',
}

4
models/__init__.py Normal file
View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from . import hr_employee
from . import pos_session

13
models/hr_employee.py Normal file
View File

@ -0,0 +1,13 @@
# -*- coding: utf-8 -*-
from odoo import fields, models
class HrEmployee(models.Model):
_inherit = 'hr.employee'
pos_role = fields.Selection([
('waiter', 'Waiter/Server'),
('cashier', 'Cashier'),
('outlet_manager', 'Outlet Manager'),
('area_manager', 'Area Manager')
], string='POS Role', default='waiter', help='Defines the permission level constraint in the Point of Sale.')

11
models/pos_session.py Normal file
View File

@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
from odoo import models
class PosSession(models.Model):
_inherit = 'pos.session'
def _loader_params_hr_employee(self):
result = super()._loader_params_hr_employee()
result['search_params']['fields'].append('pos_role')
return result

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<!-- Restrict navbar actions based on employee role -->
<t t-name="pos_employee_role.Navbar" t-inherit="point_of_sale.Navbar" t-inherit-mode="extension">
<!-- Print Report: Outlet Manager, Area Manager -->
<xpath expr="//DropdownItem[@onSelected='() =&gt; this.showSaleDetails()']" position="attributes">
<attribute name="t-if">hardwareProxy.printer and (this.pos.cashier.pos_role == 'outlet_manager' or this.pos.cashier.pos_role == 'area_manager')</attribute>
</xpath>
<!-- Backend: Outlet Manager, Area Manager -->
<xpath expr="//DropdownItem[@onSelected='() =&gt; pos.closePos()']" position="attributes">
<attribute name="t-if">this.pos.cashier.pos_role == 'outlet_manager' or this.pos.cashier.pos_role == 'area_manager'</attribute>
</xpath>
<!-- Close Register: Not Waiter (Cashier, Outlet Manager, Area Manager) -->
<xpath expr="//DropdownItem[@onSelected='() =&gt; this.pos.closeSession()']" position="attributes">
<attribute name="t-if">this.pos.cashier.pos_role != 'waiter'</attribute>
</xpath>
</t>
</templates>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<!-- Hide payment button if role is waiter -->
<t t-name="pos_employee_role.ActionpadWidget" t-inherit="point_of_sale.ActionpadWidget" t-inherit-mode="extension">
<xpath expr="//button[contains(@class, 'pay-order-button')]" position="attributes">
<attribute name="t-if">this.pos.cashier.pos_role != 'waiter'</attribute>
</xpath>
<xpath expr="//t[@t-foreach='this.pos.config.fast_payment_method_ids']" position="attributes">
<attribute name="t-if">this.pos.cashier.pos_role != 'waiter' and showFastPaymentMethods</attribute>
</xpath>
</t>
</templates>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<!-- Hide refund button in control buttons from waiter and cashier -->
<t t-name="pos_employee_role.ControlButtons" t-inherit="point_of_sale.ControlButtons" t-inherit-mode="extension">
<xpath expr="//button[@t-on-click='() =&gt; this.clickRefund()']" position="attributes">
<attribute name="t-if">this.pos.cashier._role != 'minimal' and (this.pos.cashier.pos_role == 'outlet_manager' or this.pos.cashier.pos_role == 'area_manager')</attribute>
</xpath>
</t>
</templates>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<!-- Hide refund button in Ticket Screen from waiter and cashier -->
<t t-name="pos_employee_role.TicketScreen" t-inherit="point_of_sale.TicketScreen" t-inherit-mode="extension">
<xpath expr="//button[@actionToTrigger.bind='onDoRefund']" position="attributes">
<attribute name="t-if">getHasItemsToRefund() and (this.pos.cashier.pos_role == 'outlet_manager' or this.pos.cashier.pos_role == 'area_manager')</attribute>
</xpath>
</t>
</templates>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_employee_view_form_pos_role" model="ir.ui.view">
<field name="name">hr.employee.form.pos.role.inherit</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form" />
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
</xpath>
<!-- In Odoo 19, hr.employee form view has Point of Sale settings under identification_group -->
<xpath expr="//group[@name='identification_group']" position="inside">
<field name="pos_role" />
</xpath>
</field>
</record>
</odoo>