role based access feature enabled

This commit is contained in:
Alaguraj0361 2026-01-23 18:36:48 +05:30
parent 8aac33c4ff
commit e7e35d7ad2
13 changed files with 222 additions and 0 deletions

View File

@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import models

View File

@ -0,0 +1,28 @@
{
'name': 'Restaurant Management System',
'version': '1.0',
'category': 'Sales/Point of Sale',
'summary': 'Advanced Role-Based Access for Restaurants',
'description': """
Complete Role-Based Access Control for Restaurant:
- Admin/Owner
- Manager
- Cashier
- Waiter/Captain
- Kitchen (KDS)
- Store Keeper
""",
'author': 'Antigravity',
'depends': ['point_of_sale', 'purchase', 'stock', 'website_sale'],
'data': [
'security/restaurant_security.xml',
'security/ir.model.access.csv',
'security/restaurant_rules.xml',
'views/restaurant_menus.xml',
'views/pos_order_views.xml',
'views/res_users_views.xml',
],
'installable': True,
'application': True,
'license': 'LGPL-3',
}

View File

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

View File

@ -0,0 +1,42 @@
from odoo import models, fields, api
class ResUsers(models.Model):
_inherit = 'res.users'
restaurant_role = fields.Selection([
('waiter', 'Waiter / Captain'),
('chef', 'Chef / Kitchen Staff'),
('cashier', 'Cashier'),
('manager', 'Manager'),
('admin', 'Admin / Owner'),
('store', 'Store Keeper'),
], string='Restaurant Role', help="Select the staff member's primary role.")
@api.onchange('restaurant_role')
def _onchange_restaurant_role(self):
if not self.restaurant_role:
return
# Map roles to their XML IDs
role_mapping = {
'waiter': 'restaurant_management.group_restaurant_waiter',
'chef': 'restaurant_management.group_restaurant_kitchen',
'cashier': 'restaurant_management.group_restaurant_cashier',
'manager': 'restaurant_management.group_restaurant_manager',
'admin': 'restaurant_management.group_restaurant_admin',
'store': 'restaurant_management.group_restaurant_store_keeper',
}
# Clear existing restaurant groups first (optional, but cleaner)
# We can find them by category
category = self.env.ref('restaurant_management.module_category_restaurant_staff', raise_if_not_found=False)
if category:
restaurant_groups = self.env['res.groups'].search([('category_id', '=', category.id)])
self.groups_id = [(3, g.id) for g in restaurant_groups]
# Add the selected group
group_xml_id = role_mapping.get(self.restaurant_role)
if group_xml_id:
group = self.env.ref(group_xml_id)
if group:
self.groups_id = [(4, group.id)]

View File

@ -0,0 +1,6 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_pos_order_manager,pos.order.manager,point_of_sale.model_pos_order,group_restaurant_manager,1,1,1,1
access_pos_order_waiter,pos.order.waiter,point_of_sale.model_pos_order,group_restaurant_waiter,1,1,1,0
access_pos_order_cashier,pos.order.cashier,point_of_sale.model_pos_order,group_restaurant_cashier,1,1,1,1
access_stock_picking_store,stock.picking.store,stock.model_stock_picking,group_restaurant_store_keeper,1,1,1,0
access_kds_order_kitchen,pos.order.kitchen,point_of_sale.model_pos_order,group_restaurant_kitchen,1,1,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_pos_order_manager pos.order.manager point_of_sale.model_pos_order group_restaurant_manager 1 1 1 1
3 access_pos_order_waiter pos.order.waiter point_of_sale.model_pos_order group_restaurant_waiter 1 1 1 0
4 access_pos_order_cashier pos.order.cashier point_of_sale.model_pos_order group_restaurant_cashier 1 1 1 1
5 access_stock_picking_store stock.picking.store stock.model_stock_picking group_restaurant_store_keeper 1 1 1 0
6 access_kds_order_kitchen pos.order.kitchen point_of_sale.model_pos_order group_restaurant_kitchen 1 1 0 0

View File

@ -0,0 +1,20 @@
<odoo>
<data noupdate="1">
<!-- Waiter can only see their own orders -->
<record id="rule_waiter_own_orders" model="ir.rule">
<field name="name">Waiter Own Orders</field>
<field name="model_id" ref="point_of_sale.model_pos_order"/>
<field name="domain_force">[('user_id', '=', user.id)]</field>
<field name="groups" eval="[(4, ref('group_restaurant_waiter'))]"/>
</record>
<!-- Kitchen staff can see all orders in 'draft' or 'paid' (depending on how KDS is implemented) -->
<!-- Usually KDS filters by 'pos_order_line' preparation status -->
<record id="rule_kitchen_all_orders" model="ir.rule">
<field name="name">Kitchen View Orders</field>
<field name="model_id" ref="point_of_sale.model_pos_order"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('group_restaurant_kitchen'))]"/>
</record>
</data>
</odoo>

View File

@ -0,0 +1,52 @@
<odoo>
<data>
<!-- 1. Category for Staff Roles (Dropdown selection) -->
<record id="module_category_restaurant_staff" model="ir.module.category">
<field name="name">Restaurant Staff Role</field>
<field name="description">Select the staff member's primary role.</field>
<field name="sequence">500</field>
</record>
<!-- Kitchen / Chef Role -->
<record id="group_restaurant_kitchen" model="res.groups">
<field name="name">Chef / Kitchen Staff</field>
<field name="category_id" ref="module_category_restaurant_staff"/>
</record>
<!-- Waiter Role -->
<record id="group_restaurant_waiter" model="res.groups">
<field name="name">Waiter / Captain</field>
<field name="category_id" ref="module_category_restaurant_staff"/>
<field name="implied_ids" eval="[(4, ref('point_of_sale.group_pos_user'))]"/>
</record>
<!-- Store Role -->
<record id="group_restaurant_store_keeper" model="res.groups">
<field name="name">Store Keeper</field>
<field name="category_id" ref="module_category_restaurant_staff"/>
<field name="implied_ids" eval="[(4, ref('stock.group_stock_user'))]"/>
</record>
<!-- Cashier Role (Inherits Waiter) -->
<record id="group_restaurant_cashier" model="res.groups">
<field name="name">Cashier</field>
<field name="category_id" ref="module_category_restaurant_staff"/>
<field name="implied_ids" eval="[(4, ref('group_restaurant_waiter'))]"/>
</record>
<!-- Manager Role -->
<record id="group_restaurant_manager" model="res.groups">
<field name="name">Manager</field>
<field name="category_id" ref="module_category_restaurant_staff"/>
<field name="implied_ids" eval="[(4, ref('group_restaurant_cashier')), (4, ref('point_of_sale.group_pos_manager')), (4, ref('stock.group_stock_user'))]"/>
</record>
<!-- Admin / Owner -->
<record id="group_restaurant_admin" model="res.groups">
<field name="name">Admin / Owner</field>
<field name="category_id" ref="module_category_restaurant_staff"/>
<field name="implied_ids" eval="[(4, ref('group_restaurant_manager')), (4, ref('group_restaurant_kitchen'))]"/>
</record>
</data>
</odoo>

View File

@ -0,0 +1,34 @@
<odoo>
<!-- Simplified Kitchen View for POS Order Lines -->
<record id="view_pos_order_line_kitchen_tree" model="ir.ui.view">
<field name="name">pos.order.line.kitchen.tree</field>
<field name="model">pos.order.line</field>
<field name="arch" type="xml">
<tree string="Kitchen Orders" create="false" edit="false">
<field name="order_id"/>
<field name="product_id"/>
<field name="qty"/>
<field name="customer_note" string="Special Instructions"/>
</tree>
</field>
</record>
<record id="action_restaurant_kitchen_orders" model="ir.actions.act_window">
<field name="name">Kitchen Display</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">pos.order.line</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_pos_order_line_kitchen_tree"/>
<field name="domain">[('order_id.state', 'in', ['paid', 'done'])]</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No orders for the kitchen yet!
</p>
</field>
</record>
<!-- Update the menu item to use this action -->
<record id="menu_restaurant_kds_orders" model="ir.ui.menu">
<field name="action" ref="action_restaurant_kitchen_orders"/>
</record>
</odoo>

View File

@ -0,0 +1,14 @@
<odoo>
<record id="view_users_form_restaurant_roles_final" model="ir.ui.view">
<field name="name">res.users.form.restaurant.roles.final</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form"/>
<field name="arch" type="xml">
<xpath expr="//page[@name='access_rights']" position="inside">
<group string="Restaurant Management" name="restaurant_staff_roles_group">
<field name="restaurant_role"/>
</group>
</xpath>
</field>
</record>
</odoo>

View File

@ -0,0 +1,23 @@
<odoo>
<!-- Hide certain menus for specific roles -->
<record id="stock.menu_stock_root" model="ir.ui.menu">
<field name="groups_id" eval="[(4, ref('group_restaurant_manager')), (4, ref('group_restaurant_store_keeper'))]"/>
</record>
<record id="point_of_sale.menu_point_root" model="ir.ui.menu">
<field name="groups_id" eval="[(4, ref('group_restaurant_manager')), (4, ref('group_restaurant_waiter')), (4, ref('group_restaurant_cashier'))]"/>
</record>
<!-- Custom Kitchen Dashboard Menu -->
<menuitem id="menu_restaurant_kds_root"
name="Kitchen (KDS)"
web_icon="point_of_sale,static/description/icon.png"
groups="group_restaurant_kitchen,group_restaurant_manager"
sequence="20"/>
<menuitem id="menu_restaurant_kds_orders"
name="Preparation Orders"
parent="menu_restaurant_kds_root"
action="point_of_sale.action_pos_order_line_form"
sequence="10"/>
</odoo>