Browse Source

Jun 27: [FIX] Bug Fixed 'employee_bonus_manager'

pull/380/merge
Cybrosys Technologies 4 weeks ago
parent
commit
e36f29abec
  1. 6
      employee_bonus_manager/__manifest__.py
  2. 10
      employee_bonus_manager/data/hr_payroll_structure_data.xml
  3. 11
      employee_bonus_manager/data/hr_salary_rule_data.xml
  4. 7
      employee_bonus_manager/data/ir_sequence_data.xml
  5. 6
      employee_bonus_manager/doc/RELEASE_NOTES.md
  6. 1
      employee_bonus_manager/models/__init__.py
  7. 3
      employee_bonus_manager/models/bonus_reason.py
  8. 93
      employee_bonus_manager/models/bonus_request.py
  9. 28
      employee_bonus_manager/models/hr_payslip.py
  10. 4
      employee_bonus_manager/views/bonus_reason_views.xml
  11. 127
      employee_bonus_manager/views/bonus_request_views.xml
  12. 18
      employee_bonus_manager/views/employee_bonus_manager_menus.xml

6
employee_bonus_manager/__manifest__.py

@ -21,7 +21,7 @@
###############################################################################
{
'name': 'Employee Bonus',
'version': '16.0.1.0.0',
'version': '16.0.2.1.0',
'category': 'Human Resources',
'summary': 'This module will help you in managing the employee bonus.',
'description': """This module helps to manage the bonus for employees , the
@ -30,12 +30,14 @@
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
'depends': ['base', 'hr'],
'depends': ['base', 'hr','account','hr_payroll_community'],
'data': [
'security/employee_bonus_manager_groups.xml',
'security/bonus_request_security.xml',
'security/ir.model.access.csv',
'data/ir_sequence_data.xml',
'data/hr_salary_rule_data.xml',
'data/hr_payroll_structure_data.xml',
'views/bonus_request_views.xml',
'views/bonus_reason_views.xml',
'views/employee_bonus_manager_menus.xml'

10
employee_bonus_manager/data/hr_payroll_structure_data.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo noupdate="1">
<record id="hr_payroll_community.structure_base" model="hr.payroll.structure">
<field name="rule_ids"
eval="[(6, 0, [ref('hr_payroll_community.hr_rule_basic'),
ref('hr_payroll_community.hr_rule_taxable'),
ref('hr_payroll_community.hr_rule_net'),
ref('hr_salary_rule_bonus')])]"/>
</record>
</odoo>

11
employee_bonus_manager/data/hr_salary_rule_data.xml

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo noupdate="1">
<record id="hr_salary_rule_bonus" model="hr.salary.rule">
<field name="name">Employee Bonus</field>
<field name="code">BONUS</field>
<field name="category_id" ref="hr_payroll_community.ALW"/>
<field name="sequence" eval="59"/>
<field name="amount_select">code</field>
<field name="amount_python_compute">result = inputs.BONUS.amount</field>
</record>
</odoo>

7
employee_bonus_manager/data/ir_sequence_data.xml

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Sequence number for Bonus Request -->
<?xml version="1.0" encoding="UTF-8"?>
<odoo noupdate="1">
<record id="ir_sequence_bonus_request" model="ir.sequence">
<field name="name">Bonus Request Sequence</field>
<field name="code">bonus.request</field>
@ -8,4 +7,4 @@
<field name="padding">4</field>
<field name="company_id" eval="False"/>
</record>
</odoo>
</odoo>

6
employee_bonus_manager/doc/RELEASE_NOTES.md

@ -5,3 +5,9 @@
#### ADD
Initial Commit for Employee Bonus
#### 27.0.2024
#### Version 16.0.2.1.0
#### UPDT
Add functionality of calculate payslip based on the employee bonus

1
employee_bonus_manager/models/__init__.py

@ -21,3 +21,4 @@
###############################################################################
from . import bonus_reason
from . import bonus_request
from . import hr_payslip

3
employee_bonus_manager/models/bonus_reason.py

@ -22,10 +22,11 @@
from odoo import fields, models
class BonusReason(models.Model):
""" This class is used to create the bonus reasons. """
_name = "bonus.reason"
_description = 'Bonus Reasons'
name = fields.Char(string='Reason', required=True,
help='Reason to be added for the bonus requests.')
help='Reason to be added for the bonus requests.')

93
employee_bonus_manager/models/bonus_request.py

@ -31,7 +31,7 @@ class BonusRequest(models.Model):
override create function for generating sequence number for the new
records of the model.
action_confirm(self):
actions to perform when clicking on the 'Confirm' button.
actions to perform when clicking on the 'Submit' button.
action_department_approve(self):
actions to perform when clicking on the 'Approve by Department'
button.
@ -42,18 +42,23 @@ class BonusRequest(models.Model):
actions to perform when clicking on the 'Reject' button.
action_reset_to_draft(self):
actions to perform when clicking on the 'Reset to Draft' button.
action_post_journal_entry(self):
actions to create and post a journal entry for the bonus.
action_view_journal_items(self):
action to view the journal items for the bonus request.
"""
_name = 'bonus.request'
_description = 'Bonus Request'
_inherit = 'mail.thread'
_rec_name = 'reference_no'
_rec_name = 'reference'
reference_no = fields.Char(string='Reference Number', copy=False,
help='Sequence number for the bonus request.')
reference = fields.Char(string='Reference Number', copy=False,
help='Sequence number for the bonus request.')
state = fields.Selection(
[('draft', 'Draft'), ('confirmed', 'Confirmed'),
[('draft', 'Draft'), ('submitted', 'Submitted'),
('department_approved', 'Department Approved'),
('manager_approved', 'Manager Approved'), ('rejected', 'Rejected')],
('manager_approved', 'Manager Approved'), ('accounting', 'Accounting Head Approved'),
('posted', 'Posted'), ('rejected', 'Rejected')],
string='State', default='draft', copy=False, tracking=True,
help='State of the bonus request.')
employee_id = fields.Many2one(
@ -63,8 +68,8 @@ class BonusRequest(models.Model):
'res.users', string='User', related='employee_id.user_id',
help='The user of the employee(If any)')
department_id = fields.Many2one('hr.department', string='Department',
related='employee_id.department_id',
help='The department of the employee.')
related='employee_id.department_id',
help='The department of the employee.')
job_id = fields.Many2one(
'hr.job', string='Job', related='employee_id.job_id',
help='Job of the employee')
@ -81,7 +86,7 @@ class BonusRequest(models.Model):
bonus_amount = fields.Float(string='Bonus Amount', tracking=True,
help='This amount will be given as the bonus.')
currency_id = fields.Many2one(
'res.currency', string='Company Currency', required=True,
'res.currency', string='Company Currency', required=True,
readonly=True,
default=lambda self: self.env.user.company_id.currency_id,
help='Company Currency')
@ -100,6 +105,21 @@ class BonusRequest(models.Model):
hr_manager_id = fields.Many2one(
'res.users', string='Manager', readonly=True, copy=False,
help='Name of the Manager, who approved the bonus request.')
journal_id = fields.Many2one('account.journal', string='Bonus Journal',
help='The Journal for bonus request',
company_dependent=True, required=False,
domain="[('type', '=', 'general')]")
move_id = fields.Many2one('account.move', string='Accounting Entry',
help='Accounting entry of bonus request',
readonly=True)
credit_account_id = fields.Many2one('account.account',
string='Credit Account',
help='The credit account for creating '
'journal entry')
debit_account_id = fields.Many2one('account.account',
string='Debit Account',
help='The debit account for creating '
'journal entry')
@api.model
def create(self, vals):
@ -109,21 +129,21 @@ class BonusRequest(models.Model):
Returns:
models.Model: the created records of 'bonus.request'.
"""
if vals.get('reference_no', 'New') == 'New':
vals['reference_no'] = self.env['ir.sequence'].next_by_code(
if vals.get('reference', 'New') == 'New':
vals['reference'] = self.env['ir.sequence'].next_by_code(
'bonus.request') or 'New'
res = super(BonusRequest, self).create(vals)
return res
def action_confirm(self):
"""
Function for the 'Confirm' button to change the state to 'confirmed',
Function for the 'Submit' button to change the state to 'submitted',
and update the confirmed user and date.
"""
self.write({
'state': 'confirmed',
'state': 'submitted',
'confirmed_user_id': self._uid,
'confirmed_date': fields.Datetime.today()
'confirmed_date': fields.Date.today()
})
def action_department_approve(self):
@ -135,18 +155,18 @@ class BonusRequest(models.Model):
self.write({
'state': 'department_approved',
'department_manager_id': self._uid,
'department_approved_date': fields.Datetime.today()
'department_approved_date': fields.Date.today()
})
def action_manager_approve(self):
"""
Function for the 'Approve by Manager' button to change the state to
'manager_approved', and update the HR manager and approved date & time.
'manager_approved', and update the HR manager and approved date.
"""
self.write({
'state': 'manager_approved',
'hr_manager_id': self._uid,
'manager_approved_date': fields.Datetime.today()
'manager_approved_date': fields.Date.today()
})
def action_reject(self):
@ -169,3 +189,42 @@ class BonusRequest(models.Model):
'hr_manager_id': False,
'manager_approved_date': False
})
def action_post_journal_entry(self):
""" Function for the 'Post Journal Entry' button to create and post a journal entry
for approved bonus request and change state to 'posted' """
account_move = self.env['account.move'].create({
'ref': self.reference,
'state': 'draft',
'date': self.manager_approved_date,
'journal_id': self.journal_id.id,
'line_ids': [
(0, 0, {
'account_id': self.credit_account_id.id,
'credit': self.bonus_amount,
'name': self.employee_id.name + '-' + self.reference,
'debit': 0.0,
}),
(0, 0, {
'account_id': self.debit_account_id.id,
'debit': self.bonus_amount,
'name': self.employee_id.name + '-' + self.reference,
'credit': 0.0,
})
]
})
account_move.action_post()
self.write({
'move_id': account_move.id,
'state': 'posted'
})
def action_view_journal_items(self):
"""To view the journal items for the bonus request"""
return {
'name': 'Journal Items',
'type': 'ir.actions.act_window',
'res_model': 'account.move',
'view_mode': 'form',
'res_id': self.move_id.id
}

28
employee_bonus_manager/models/hr_payslip.py

@ -0,0 +1,28 @@
from odoo import api, fields, models
class HrPayslip(models.Model):
""" This class extends hr.payslip to include bonus amounts in payslip calculation. """
_inherit = "hr.payslip"
@api.onchange('employee_id', 'date_from', 'date_to', 'struct_id')
def _onchange_employee(self):
""" When changing employee, load bonus amount as other input """
self.ensure_one() # Ensure single record for onchange
bonus_rule = self.env.ref('employee_bonus_manager.hr_salary_rule_bonus')
rules = self.struct_id.rule_ids.mapped('name')
if bonus_rule.name in rules:
bonus = self.env['bonus.request'].search([
('employee_id', '=', self.employee_id.id),
('state', '=', 'posted'),
('move_id.state', '=', 'posted'),
('move_id.date', '>=', self.date_from),
('move_id.date', '<=', self.date_to)
])
amount = sum(bonus.mapped('bonus_amount'))
self.input_line_ids = [(0, 0, {
'name': 'Bonus',
'code': 'BONUS',
'contract_id': self.contract_id.id,
'amount': amount,
})]

4
employee_bonus_manager/views/bonus_reason_views.xml

@ -10,8 +10,9 @@
</tree>
</field>
</record>
<!-- Form view for Bonus Reason -->
<record id="bonus_reason_view_from" model="ir.ui.view">
<record id="bonus_reason_view_form" model="ir.ui.view">
<field name="name">bonus.reason.view.form</field>
<field name="model">bonus.reason</field>
<field name="arch" type="xml">
@ -27,6 +28,7 @@
</form>
</field>
</record>
<!-- Action window for Bonus Reason -->
<record id="bonus_reason_action" model="ir.actions.act_window">
<field name="name">Bonus Reasons</field>

127
employee_bonus_manager/views/bonus_request_views.xml

@ -7,41 +7,59 @@
<field name="arch" type="xml">
<form>
<header>
<field name="state" widget="statusbar" statusbar_visible="draft,confirmed,department_approved,manager_approved"/>
<button name="action_confirm" type="object" string="Confirm"
attrs="{'invisible':[('state','!=','draft')]}" class="btn-primary"/>
<button name="action_department_approve" type="object" string="Approve by Department"
attrs="{'invisible':[('state','!=','confirmed')]}" class="btn-primary"
<field name="state" widget="statusbar"
statusbar_visible="draft,submitted,department_approved,manager_approved,accounting,posted"/>
<button name="action_confirm" type="object" string="Submit"
attrs="{'invisible': [('state', '!=', 'draft')]}" class="btn-primary"/>
<button name="action_department_approve" type="object"
string="Approve by Department"
attrs="{'invisible': [('state', '!=', 'submitted')]}" class="btn-primary"
groups="employee_bonus_manager.employee_bonus_manager_department"/>
<button name="action_manager_approve" type="object" string="Approve by Manager"
attrs="{'invisible':[('state','!=','department_approved')]}" class="btn-primary"
<button name="action_manager_approve" type="object"
string="Approve by Manager"
attrs="{'invisible': [('state', '!=', 'department_approved')]}" class="btn-primary"
groups="employee_bonus_manager.employee_bonus_manager_manager"/>
<button name="action_reject" type="object" string="Reject"
groups="employee_bonus_manager.employee_bonus_manager_department"
attrs="{'invisible':[('state','!=','confirmed')]}"/>
attrs="{'invisible': [('state', '!=', 'submitted')]}" class="oe_highlight"/>
<button name="action_reject" type="object" string="Reject"
groups="employee_bonus_manager.employee_bonus_manager_manager"
attrs="{'invisible':[('state','!=','department_approved')]}"/>
<button name="action_reset_to_draft" type="object" string="Reset to Draft"
attrs="{'invisible': [('state', '!=', 'department_approved')]}" class="oe_highlight"/>
<button name="action_reset_to_draft" type="object"
string="Reset to Draft"
groups="employee_bonus_manager.employee_bonus_manager_department"
attrs="{'invisible':[('state','!=','rejected')]}"/>
attrs="{'invisible': [('state', '!=', 'rejected')]}" class="oe_highlight"/>
<button name="action_post_journal_entry" type="object"
string="Accounting Head Approval"
groups="account.group_account_manager"
attrs="{'invisible': [('state', '!=', 'manager_approved')]}" class="oe_highlight"/>
</header>
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" type="object"
name="action_view_journal_items"
attrs="{'invisible': [('move_id', '=', False)]}" icon="fa-bars">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Journal</span>
<span class="o_stat_text">Items</span>
</div>
</button>
</div>
<sheet>
<h1>
<field name="reference_no" readonly="1"/>
<field name="reference" readonly="1"/>
</h1>
<h2>
<field name="employee_id" attrs="{'readonly':[('state','!=','draft')]}"/>
<field name="employee_id" attrs="{'readonly': [('state', '!=', 'draft')]}" />
</h2>
<group>
<group>
<field name="department_id"/>
<field name="job_id"/>
<field name="bonus_reason_id" attrs="{'readonly':[('state','!=','draft')]}"/>
<field name="bonus_reason_id" attrs="{'readonly': [('state', '!=', 'draft')]}" />
</group>
<group>
<field name="create_date"/>
<field name="bonus_amount" widget="monetary" attrs="{'readonly':[('state','not in',('draft','confirmed'))]}"/>
<field name="bonus_amount" widget="monetary" attrs="{'readonly': [('state', 'not in', ('draft', 'submitted'))]}"/>
<field name="currency_id" invisible="1"/>
</group>
</group>
@ -52,6 +70,7 @@
<field name="confirmed_date"/>
<field name="department_manager_id"/>
<field name="department_approved_date"/>
<field name="move_id" invisible="1"/>
</group>
<group>
<field name="confirmed_user_id"/>
@ -60,6 +79,21 @@
</group>
</group>
</page>
<page string="Accounting Information"
groups="account.group_account_manager"
attrs="{'invisible': [('state', 'not in', ('manager_approved', 'accounting', 'posted'))]}">
<group>
<group>
<field name="journal_id"/>
<field name="move_id"/>
</group>
<group>
<field name="credit_account_id"
attrs="{'readonly': [('state', '!=', 'manager_approved')], 'required': [('state', '=', 'manager_approved')]}" />
<field name="debit_account_id"/>
</group>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
@ -69,17 +103,18 @@
</form>
</field>
</record>
<!-- Tree view for Bonus Requests -->
<record id="bonus_request_view_tree" model="ir.ui.view">
<field name="name">bonus.request.view.tree</field>
<!-- List view for Bonus Requests -->
<record id="bonus_request_view_list" model="ir.ui.view">
<field name="name">bonus.request.view.list</field>
<field name="model">bonus.request</field>
<field name="arch" type="xml">
<tree default_order='create_date'
<tree default_order="create_date"
decoration-warning="state == 'draft'"
decoration-info="state == 'department_approved'"
decoration-success="state == 'manager_approved'"
decoration-danger="state == 'rejected'">
<field name="reference_no"/>
<field name="reference"/>
<field name="employee_id"/>
<field name="department_id"/>
<field name="job_id"/>
@ -101,13 +136,14 @@
</tree>
</field>
</record>
<!-- Kanban view for Bonus Requests -->
<record id="bonus_request_view_kanban" model="ir.ui.view">
<field name="name">bonus.request.view.kanban</field>
<field name="model">bonus.request</field>
<field name="arch" type="xml">
<kanban class="o_bonus_request_kanban">
<field name="reference_no"/>
<kanban class="o_bonus_request_kanban" records_draggable="0" default_group_by="state" default_order="state">
<field name="reference"/>
<field name="employee_id"/>
<field name="department_id"/>
<field name="job_id"/>
@ -139,7 +175,7 @@
</div>
<div class="o_kanban_record_bottom flex-wrap">
<div class="oe_kanban_bottom_left">
<t t-esc="record.reference_no.value"/>
<t t-esc="record.reference.value"/>
</div>
<div class="oe_kanban_bottom_right">
<t t-esc="record.state.value"/>
@ -152,6 +188,7 @@
</kanban>
</field>
</record>
<!-- Graph view for Bonus Requests -->
<record id="bonus_request_view_graph" model="ir.ui.view">
<field name="name">bonus.request.view.graph</field>
@ -163,6 +200,7 @@
</graph>
</field>
</record>
<!-- Pivot view for Bonus Requests -->
<record id="bonus_request_view_pivot" model="ir.ui.view">
<field name="name">bonus.request.view.pivot</field>
@ -174,6 +212,7 @@
</pivot>
</field>
</record>
<!-- Calendar view for Bonus Requests -->
<record id="bonus_request_view_calendar" model="ir.ui.view">
<field name="name">bonus.request.view.calendar</field>
@ -196,13 +235,14 @@
</calendar>
</field>
</record>
<!-- Search view for Bonus Requests -->
<record id="bonus_request_view_search" model="ir.ui.view">
<field name="name">bonus.request.view.search</field>
<field name="model">bonus.request</field>
<field name="arch" type="xml">
<search>
<field name="reference_no"/>
<field name="reference"/>
<field name="employee_id"/>
<field name="department_id"/>
<field name="job_id"/>
@ -225,18 +265,17 @@
</group>
<filter name="created_today" string="Created Today" domain="[('create_date', '=', context_today().strftime('%Y-%m-%d'))]"/>
<filter name="confirmed_today" string="Confirmed Today" domain="[('confirmed_date', '=', context_today().strftime('%Y-%m-%d'))]"/>
<filter name="department_approved_date_today" string="Department Approved: Today"
domain="[('department_approved_date', '=', context_today().strftime('%Y-%m-%d'))]"/>
<filter name="manager_approved_date_today" string="Manager Approved: Today"
domain="[('manager_approved_date', '=', context_today().strftime('%Y-%m-%d'))]"/>
<filter name="draft" string="Draft" domain="[('state', '=','draft' )]"/>
<filter name="confirmed" string="Confirmed" domain="[('state', '=','confirmed' )]"/>
<filter name="department_approved" string="Approval by Department" domain="[('state', '=','department_approved' )]"/>
<filter name="manager_approved" string="Approval by Manager" domain="[('state', '=','manager_approved' )]"/>
<filter name="rejected" string="Rejected" domain="[('state', '=','rejected' )]"/>
<filter name="department_approved_date_today" string="Department Approved: Today" domain="[('department_approved_date', '=', context_today().strftime('%Y-%m-%d'))]"/>
<filter name="manager_approved_date_today" string="Manager Approved: Today" domain="[('manager_approved_date', '=', context_today().strftime('%Y-%m-%d'))]"/>
<filter name="draft" string="Draft" domain="[('state', '=', 'draft')]"/>
<filter name="submitted" string="Submitted" domain="[('state', '=', 'submitted')]"/>
<filter name="department_approved" string="Approval by Department" domain="[('state', '=', 'department_approved')]"/>
<filter name="manager_approved" string="Approval by Manager" domain="[('state', '=', 'manager_approved')]"/>
<filter name="rejected" string="Rejected" domain="[('state', '=', 'rejected')]"/>
</search>
</field>
</record>
<!-- Action window for Bonus Request -->
<record id="bonus_request_action" model="ir.actions.act_window">
<field name="name">Bonus Requests</field>
@ -249,6 +288,7 @@
</p>
</field>
</record>
<!-- Action window for Bonus Request: for Department Approval -->
<record id="bonus_request_department_action" model="ir.actions.act_window">
<field name="name">Department Approval</field>
@ -256,7 +296,7 @@
<field name="res_model">bonus.request</field>
<field name="view_mode">tree,kanban,graph,pivot,calendar,form</field>
<field name="context">{'create': False}</field>
<field name="domain">[('state','=','confirmed')]</field>
<field name="domain">[('state', '=', 'submitted')]</field>
<field name="search_view_id" ref="bonus_request_view_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
@ -264,6 +304,7 @@
</p>
</field>
</record>
<!-- Action window for Bonus Request: for Manager Approval -->
<record id="bonus_request_manager_action" model="ir.actions.act_window">
<field name="name">Manager Approval</field>
@ -271,7 +312,7 @@
<field name="res_model">bonus.request</field>
<field name="view_mode">tree,kanban,graph,pivot,calendar,form</field>
<field name="context">{'create': False}</field>
<field name="domain">[('state','=','department_approved')]</field>
<field name="domain">[('state', '=', 'department_approved')]</field>
<field name="search_view_id" ref="bonus_request_view_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
@ -279,4 +320,20 @@
</p>
</field>
</record>
<!-- Action window for Bonus Request: for Accounting Head -->
<record id="bonus_request_accounting_action" model="ir.actions.act_window">
<field name="name">Accounting Head Approval</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">bonus.request</field>
<field name="view_mode">tree,kanban,graph,pivot,calendar,form</field>
<field name="context">{'create': False}</field>
<field name="domain">[('state', '=', 'manager_approved')]</field>
<field name="search_view_id" ref="bonus_request_view_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No requests found for Accounting Head
</p>
</field>
</record>
</odoo>

18
employee_bonus_manager/views/employee_bonus_manager_menus.xml

@ -1,27 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Root Menu for the module -->
<menuitem id="employee_bonus_manager_menu_root" name="Bonus Requests"
web_icon="employee_bonus_manager,static/description/icon.png"
groups="employee_bonus_manager.employee_bonus_manager_user" sequence="190"/>
<!-- Menus and submenus for the module -->
<menuitem id="bonus_request_menu_root" name="Requests"
parent="employee_bonus_manager.employee_bonus_manager_menu_root" sequence="1"/>
<menuitem id="bonus_request_menu_action" name="All Requests"
parent="employee_bonus_manager.bonus_request_menu_root" action="bonus_request_action" sequence="1"/>
<menuitem id="bonus_request_menu_action" name="All Requests" parent="employee_bonus_manager.bonus_request_menu_root"
action="bonus_request_action" sequence="1"/>
<menuitem id="bonus_request_approve_menu_root" name="For Approval"
parent="employee_bonus_manager.bonus_request_menu_root"
groups="employee_bonus_manager.employee_bonus_manager_department"
sequence="2"/>
groups="employee_bonus_manager.employee_bonus_manager_department" sequence="2"/>
<menuitem id="bonus_request_department_menu_action" name="Department"
parent="employee_bonus_manager.bonus_request_approve_menu_root" action="bonus_request_department_action"
groups="employee_bonus_manager.employee_bonus_manager_department" sequence="1"/>
<menuitem id="bonus_request_manager_menu_action" name="Manager"
parent="employee_bonus_manager.bonus_request_approve_menu_root" action="bonus_request_manager_action"
groups="employee_bonus_manager.employee_bonus_manager_manager" sequence="2"/>
<menuitem id="bonus_request_accounting_menu_action" name="Accounting Head"
parent="employee_bonus_manager.bonus_request_approve_menu_root" action="bonus_request_accounting_action"
groups="account.group_account_manager" sequence="3"/>
<menuitem id="employee_bonus_manager_config_menu_root" name="Configuration"
parent="employee_bonus_manager.employee_bonus_manager_menu_root" sequence="100"/>
<menuitem id="bonus_reason_menu_action" name="Bonus Reasons"
parent="employee_bonus_manager.employee_bonus_manager_config_menu_root"
action="bonus_reason_action" sequence="1"/>
parent="employee_bonus_manager.employee_bonus_manager_config_menu_root" action="bonus_reason_action"
sequence="1"/>>
</odoo>

Loading…
Cancel
Save