diff --git a/employee_bonus_manager/README.rst b/employee_bonus_manager/README.rst new file mode 100644 index 000000000..3d46ce58c --- /dev/null +++ b/employee_bonus_manager/README.rst @@ -0,0 +1,53 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg + :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +Employee Bonus +============== +This module will help you in managing employee bonus. + +Configuration +============= +* Add users to the three user groups + - User: can create and submit the bonus request + - Department Head: can approve the bonus request of users + - Manager(HR Manager): can approve the bonus request of users + +Company +------- +* `Cybrosys Techno Solutions `__ + +License +------- +Affero General Public License v3.0 (AGPL v3) + +(https://www.gnu.org/licenses/agpl-3.0-standalone.html) + +Credits +------- +Developer : (V15) Ruksana P, + (V16) Sabeel B + +Contact:odoo@cybrosys.com + +Contacts +-------- +* Mail Contact : odoo@cybrosys.com +* Website : https://cybrosys.com + +Bug Tracker +----------- +Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. + +Maintainer +========== +.. image:: https://cybrosys.com/images/logo.png + :target: https://cybrosys.com + +This module is maintained by Cybrosys Technologies. + +For support and more information, please visit `Our Website `__ + +Further information +=================== +HTML Description: ``__ diff --git a/employee_bonus_manager/__init__.py b/employee_bonus_manager/__init__.py new file mode 100644 index 000000000..97177d475 --- /dev/null +++ b/employee_bonus_manager/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Sabeel B (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from . import models diff --git a/employee_bonus_manager/__manifest__.py b/employee_bonus_manager/__manifest__.py new file mode 100644 index 000000000..65ebbc9a8 --- /dev/null +++ b/employee_bonus_manager/__manifest__.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Sabeel B (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +{ + 'name': 'Employee Bonus', + 'version': '17.0.1.0.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 + user can submit the bonus request , department head can validate request + manager can approve the request of employees and billing administrator can + post the journal entry. The approved bonus amount will be added to payslip + """, + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'maintainer': 'Cybrosys Techno Solutions', + 'website': "https://www.cybrosys.com", + 'depends': ['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' + ], + 'images': ['static/description/banner.jpg'], + 'license': 'AGPL-3', + 'installable': True, + 'auto_install': False, + 'application': True +} diff --git a/employee_bonus_manager/data/hr_payroll_structure_data.xml b/employee_bonus_manager/data/hr_payroll_structure_data.xml new file mode 100644 index 000000000..63c42cc4e --- /dev/null +++ b/employee_bonus_manager/data/hr_payroll_structure_data.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/employee_bonus_manager/data/hr_salary_rule_data.xml b/employee_bonus_manager/data/hr_salary_rule_data.xml new file mode 100644 index 000000000..3a567b2f5 --- /dev/null +++ b/employee_bonus_manager/data/hr_salary_rule_data.xml @@ -0,0 +1,12 @@ + + + + + code + BONUS + + Employee Bonus + + result = inputs.BONUS.amount + + diff --git a/employee_bonus_manager/data/ir_sequence_data.xml b/employee_bonus_manager/data/ir_sequence_data.xml new file mode 100644 index 000000000..c9be361c3 --- /dev/null +++ b/employee_bonus_manager/data/ir_sequence_data.xml @@ -0,0 +1,11 @@ + + + + + Bonus Request Sequence + bonus.request + BR/ + 4 + + + diff --git a/employee_bonus_manager/doc/RELEASE_NOTES.md b/employee_bonus_manager/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..629662604 --- /dev/null +++ b/employee_bonus_manager/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 09.02.2024 +#### Version 17.0.1.0.0 +#### ADD +- Initial Commit for Employee Bonus diff --git a/employee_bonus_manager/models/__init__.py b/employee_bonus_manager/models/__init__.py new file mode 100644 index 000000000..e611c2b2c --- /dev/null +++ b/employee_bonus_manager/models/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Sabeel B (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from . import bonus_reason +from . import bonus_request +from . import hr_payslip diff --git a/employee_bonus_manager/models/bonus_reason.py b/employee_bonus_manager/models/bonus_reason.py new file mode 100644 index 000000000..92bb999cb --- /dev/null +++ b/employee_bonus_manager/models/bonus_reason.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Sabeel B (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from odoo import fields, models + + +class BonusReason(models.Model): + """ This class is used to create the bonus reasons.""" + _name = "bonus.reason" + _description = 'Bonus Reason Records' + + name = fields.Char(string='Reason', required=True, + help='Reason to be added for the bonus requests.') diff --git a/employee_bonus_manager/models/bonus_request.py b/employee_bonus_manager/models/bonus_request.py new file mode 100644 index 000000000..e96dacc97 --- /dev/null +++ b/employee_bonus_manager/models/bonus_request.py @@ -0,0 +1,233 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Sabeel B (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from odoo import api, fields, models + + +class BonusRequest(models.Model): + """ This class is created for model bonus.request. It contains fields and + functions for the model. + Methods: + create(self, vals): + 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. + action_department_approve(self): + actions to perform when clicking on the 'Approve by Department' + button. + action_manager_approve(self): + actions to perform when clicking on the 'Approve by Manager' + button. + action_reject(self): + 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.""" + _name = 'bonus.request' + _description = 'Create Bonus Request' + _inherit = 'mail.thread' + _rec_name = 'reference' + + reference = fields.Char(string='Reference Number', copy=False, + help='Sequence number for the bonus request.') + state = fields.Selection([('draft', 'Draft'), ('submitted', 'Submitted'), + ('department_approved', 'Department Approved'), + ('manager_approved', 'Manager Approved'), + ('rejected', 'Rejected'), + ('accounting', 'Accounting Head Approved')], + string='State', default='draft', tracking=True, + help='State of the bonus request', copy=False, + group_expand='_group_expand_states') + employee_id = fields.Many2one('hr.employee', string='Employee', store=True, + required=True, tracking=True, + help='The bonus will be given to this ' + 'employee') + user_id = fields.Many2one('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', + help='The department of the employee', + store=True) + job_id = fields.Many2one('hr.job', string='Job', store=True, + help='Job of the employee') + bonus_reason_id = fields.Many2one('bonus.reason', string='Bonus Reason', + help='Reason for providing the Bonus', + required=True) + confirmed_user_id = fields.Many2one('res.users', string='Confirmed by', + readonly=True, copy=False, + help='This field will record the name ' + 'of the person who confirmed ' + 'the bonus request.') + confirmed_date = fields.Date(string='Confirmed Date', readonly=True, + copy=False, tracking=True, + help='Confirmed date of bonus request') + 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', + readonly=True, + default=lambda self: + self.env.user.company_id.currency_id, + help='Company Currency') + company_id = fields.Many2one('res.company', string='Company', readonly=True, + default=lambda self: self.env.company, + help='Company of the user.') + department_approved_date = fields.Date(string='Department Approved Date', + readonly=True, copy=False, + help='Date on which the bonus ' + 'request is approved by the ' + 'Department.') + manager_approved_date = fields.Date(string='Manager Approved Date', + readonly=True, copy=False, + help='Date on which the bonus request ' + 'is approved by the Manager.') + department_manager_id = fields.Many2one('res.users', readonly=True, + help='Name of the Department Head,' + ' who approved the bonus ' + 'request', copy=False, + string='Department Head') + hr_manager_id = fields.Many2one('res.users', string='Manager', copy=False, + help='Name of the Manager, who approved the' + ' bonus request', readonly=True) + journal_id = fields.Many2one('account.journal', string='Bonus Journal', + help='The Jornal for bonus request', + company_dependent=True, required=False, + domain="[('type', '=', 'general')]", + states={'accounting': [('required', True)]}) + 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): + """ Override the create function for creating new sequence number. + @params vals (dict): values for creating new records. + @returns res (models.Model): the created records of 'bonus.request' """ + 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 + + @api.onchange('employee_id') + def _onchange_employee_id(self): + """ When changing employee_id , the department_id and job_id of + employee is changed """ + if self.employee_id: + self.department_id = self.employee_id.department_id + self.job_id = self.employee_id.job_id + + def _group_expand_states(self): + """ To add the states in the kanban view """ + return [key for + key, val in type(self).state.selection] + + def action_confirm(self): + """ Function for the 'Confirm' button to change the state to + 'submitted', and update the confirmed user and date. """ + self.write({ + 'state': 'submitted', + 'confirmed_user_id': self._uid, + 'confirmed_date': fields.Date.today() + }) + + def action_department_approve(self): + """ Function for the 'Approve by Department' button to change the state + to 'department_approved', and update the department manager and approved + time. """ + self.write({ + 'state': 'department_approved', + 'department_manager_id': self._uid, + '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. + """ + self.write({ + 'state': 'manager_approved', + 'hr_manager_id': self._uid, + 'manager_approved_date': fields.Date.today() + }) + + def action_reject(self): + """ Function for the 'Reject' button to change the state to 'rejected'. + """ + self.state = 'rejected' + + def action_reset_to_draft(self): + """ Function for the 'Reset to Draft' button to change the state to + 'draft' and reset the fields which are to be updated on changing the + states.""" + self.write({ + 'state': 'draft', + 'confirmed_user_id': False, + 'confirmed_date': False, + 'department_manager_id': False, + 'department_approved_date': False, + 'hr_manager_id': False, + 'manager_approved_date': False + }) + + def action_post_journal_entry(self): + """ Function for the 'Post Journal Entry' button to create a draft entry + for approved bonus request """ + 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.state = 'posted' + self.move_id = account_move.id + self.state = 'accounting' + + 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 + } diff --git a/employee_bonus_manager/models/hr_payslip.py b/employee_bonus_manager/models/hr_payslip.py new file mode 100644 index 000000000..f0a1a2f74 --- /dev/null +++ b/employee_bonus_manager/models/hr_payslip.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Sabeel B (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from odoo import api, models + + +class HrPayslip(models.Model): + """ This class is used to create the bonus reasons. """ + _inherit = "hr.payslip" + + @api.onchange('employee_id', 'date_from', 'date_to', 'struct_id') + def _onchange_employee_id(self): + """ When changing employee the bonus amount for the employee will be + loaded as other input """ + 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', '=', 'accounting'), ('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, + })] diff --git a/employee_bonus_manager/security/bonus_request_security.xml b/employee_bonus_manager/security/bonus_request_security.xml new file mode 100644 index 000000000..d6b546fea --- /dev/null +++ b/employee_bonus_manager/security/bonus_request_security.xml @@ -0,0 +1,12 @@ + + + + + + Bonus Request multi company rule + + ['|', ('company_id', '=', False), + ('company_id', 'in', company_ids)] + + + diff --git a/employee_bonus_manager/security/employee_bonus_manager_groups.xml b/employee_bonus_manager/security/employee_bonus_manager_groups.xml new file mode 100644 index 000000000..1800af27a --- /dev/null +++ b/employee_bonus_manager/security/employee_bonus_manager_groups.xml @@ -0,0 +1,37 @@ + + + + + Employee Bonus + Access for Employee Bonus module + 50 + + + + + User + + + + + + Department Head + + + + + + Manager + + + + + + + + + diff --git a/employee_bonus_manager/security/ir.model.access.csv b/employee_bonus_manager/security/ir.model.access.csv new file mode 100644 index 000000000..3fbc863c0 --- /dev/null +++ b/employee_bonus_manager/security/ir.model.access.csv @@ -0,0 +1,7 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_bonus_request_user,access.bonus.request.user,model_bonus_request,employee_bonus_manager_group_user,1,1,1,0 +access_bonus_request_department,access.bonus.request.department,model_bonus_request,employee_bonus_manager_group_department,1,1,1,0 +access_bonus_request_manager,access.bonus.request.manager,model_bonus_request,employee_bonus_manager_group_manager,1,1,1,1 +access_bonus_reason_user,access.bonus.reason.user,model_bonus_reason,employee_bonus_manager_group_user,1,1,1,0 +access_bonus_reason_department,access.bonus.reason.department,model_bonus_reason,employee_bonus_manager_group_department,1,1,1,0 +access_bonus_reason_manager,access.bonus.reason.manager,model_bonus_reason,employee_bonus_manager_group_manager,1,1,1,1 diff --git a/employee_bonus_manager/static/description/assets/icons/capture (1).png b/employee_bonus_manager/static/description/assets/icons/capture (1).png new file mode 100644 index 000000000..8824deafc Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/capture (1).png differ diff --git a/employee_bonus_manager/static/description/assets/icons/check.png b/employee_bonus_manager/static/description/assets/icons/check.png new file mode 100644 index 000000000..c8e85f51d Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/check.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/chevron.png b/employee_bonus_manager/static/description/assets/icons/chevron.png new file mode 100644 index 000000000..2089293d6 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/chevron.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/cogs.png b/employee_bonus_manager/static/description/assets/icons/cogs.png new file mode 100644 index 000000000..95d0bad62 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/cogs.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/consultation.png b/employee_bonus_manager/static/description/assets/icons/consultation.png new file mode 100644 index 000000000..8319d4baa Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/consultation.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/ecom-black.png b/employee_bonus_manager/static/description/assets/icons/ecom-black.png new file mode 100644 index 000000000..a9385ff13 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/ecom-black.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/education-black.png b/employee_bonus_manager/static/description/assets/icons/education-black.png new file mode 100644 index 000000000..3eb09b27b Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/education-black.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/hotel-black.png b/employee_bonus_manager/static/description/assets/icons/hotel-black.png new file mode 100644 index 000000000..130f613be Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/hotel-black.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/img.png b/employee_bonus_manager/static/description/assets/icons/img.png new file mode 100644 index 000000000..70197f477 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/img.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/license.png b/employee_bonus_manager/static/description/assets/icons/license.png new file mode 100644 index 000000000..a5869797e Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/license.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/lifebuoy.png b/employee_bonus_manager/static/description/assets/icons/lifebuoy.png new file mode 100644 index 000000000..658d56ccc Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/lifebuoy.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/manufacturing-black.png b/employee_bonus_manager/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 000000000..697eb0e9f Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/manufacturing-black.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/photo-capture.png b/employee_bonus_manager/static/description/assets/icons/photo-capture.png new file mode 100644 index 000000000..06c111758 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/photo-capture.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/pos-black.png b/employee_bonus_manager/static/description/assets/icons/pos-black.png new file mode 100644 index 000000000..97c0f90c1 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/pos-black.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/puzzle.png b/employee_bonus_manager/static/description/assets/icons/puzzle.png new file mode 100644 index 000000000..65cf854e7 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/puzzle.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/restaurant-black.png b/employee_bonus_manager/static/description/assets/icons/restaurant-black.png new file mode 100644 index 000000000..4a35eb939 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/restaurant-black.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/service-black.png b/employee_bonus_manager/static/description/assets/icons/service-black.png new file mode 100644 index 000000000..301ab51cb Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/service-black.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/trading-black.png b/employee_bonus_manager/static/description/assets/icons/trading-black.png new file mode 100644 index 000000000..9398ba2f1 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/trading-black.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/training.png b/employee_bonus_manager/static/description/assets/icons/training.png new file mode 100644 index 000000000..884ca024d Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/training.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/update.png b/employee_bonus_manager/static/description/assets/icons/update.png new file mode 100644 index 000000000..ecbc5a01a Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/update.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/user.png b/employee_bonus_manager/static/description/assets/icons/user.png new file mode 100644 index 000000000..6ffb23d9f Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/user.png differ diff --git a/employee_bonus_manager/static/description/assets/icons/wrench.png b/employee_bonus_manager/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/employee_bonus_manager/static/description/assets/icons/wrench.png differ diff --git a/employee_bonus_manager/static/description/assets/misc/Cybrosys R.png b/employee_bonus_manager/static/description/assets/misc/Cybrosys R.png new file mode 100644 index 000000000..da4058087 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/misc/Cybrosys R.png differ diff --git a/employee_bonus_manager/static/description/assets/misc/email.svg b/employee_bonus_manager/static/description/assets/misc/email.svg new file mode 100644 index 000000000..15291cdc3 --- /dev/null +++ b/employee_bonus_manager/static/description/assets/misc/email.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/employee_bonus_manager/static/description/assets/misc/phone.svg b/employee_bonus_manager/static/description/assets/misc/phone.svg new file mode 100644 index 000000000..b7bd7f251 --- /dev/null +++ b/employee_bonus_manager/static/description/assets/misc/phone.svg @@ -0,0 +1,3 @@ + + + diff --git a/employee_bonus_manager/static/description/assets/misc/star (1) 2.svg b/employee_bonus_manager/static/description/assets/misc/star (1) 2.svg new file mode 100644 index 000000000..5ae9f507a --- /dev/null +++ b/employee_bonus_manager/static/description/assets/misc/star (1) 2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/employee_bonus_manager/static/description/assets/misc/support (1) 1.svg b/employee_bonus_manager/static/description/assets/misc/support (1) 1.svg new file mode 100644 index 000000000..7d37a8f30 --- /dev/null +++ b/employee_bonus_manager/static/description/assets/misc/support (1) 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/employee_bonus_manager/static/description/assets/misc/support-email.svg b/employee_bonus_manager/static/description/assets/misc/support-email.svg new file mode 100644 index 000000000..eb70370d6 --- /dev/null +++ b/employee_bonus_manager/static/description/assets/misc/support-email.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/employee_bonus_manager/static/description/assets/misc/tick-mark.svg b/employee_bonus_manager/static/description/assets/misc/tick-mark.svg new file mode 100644 index 000000000..2dbb40187 --- /dev/null +++ b/employee_bonus_manager/static/description/assets/misc/tick-mark.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/employee_bonus_manager/static/description/assets/misc/whatsapp 1.svg b/employee_bonus_manager/static/description/assets/misc/whatsapp 1.svg new file mode 100644 index 000000000..0bfaf8fc6 --- /dev/null +++ b/employee_bonus_manager/static/description/assets/misc/whatsapp 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/employee_bonus_manager/static/description/assets/misc/whatsapp.svg b/employee_bonus_manager/static/description/assets/misc/whatsapp.svg new file mode 100644 index 000000000..b618aea1d --- /dev/null +++ b/employee_bonus_manager/static/description/assets/misc/whatsapp.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/employee_bonus_manager/static/description/assets/modules/1.png b/employee_bonus_manager/static/description/assets/modules/1.png new file mode 100644 index 000000000..0e311ca87 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/modules/1.png differ diff --git a/employee_bonus_manager/static/description/assets/modules/2.png b/employee_bonus_manager/static/description/assets/modules/2.png new file mode 100644 index 000000000..a0ac2d840 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/modules/2.png differ diff --git a/employee_bonus_manager/static/description/assets/modules/3.png b/employee_bonus_manager/static/description/assets/modules/3.png new file mode 100644 index 000000000..cb17cf612 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/modules/3.png differ diff --git a/employee_bonus_manager/static/description/assets/modules/4.jpg b/employee_bonus_manager/static/description/assets/modules/4.jpg new file mode 100644 index 000000000..67c7f7062 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/modules/4.jpg differ diff --git a/employee_bonus_manager/static/description/assets/modules/5.png b/employee_bonus_manager/static/description/assets/modules/5.png new file mode 100644 index 000000000..8513873ea Binary files /dev/null and b/employee_bonus_manager/static/description/assets/modules/5.png differ diff --git a/employee_bonus_manager/static/description/assets/modules/6.jpg b/employee_bonus_manager/static/description/assets/modules/6.jpg new file mode 100644 index 000000000..73781cf50 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/modules/6.jpg differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/hero.gif b/employee_bonus_manager/static/description/assets/screenshots/hero.gif new file mode 100644 index 000000000..7519d969a Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/hero.gif differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_01.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_01.png new file mode 100644 index 000000000..59a9548d0 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_01.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_02.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_02.png new file mode 100644 index 000000000..72e47ab77 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_02.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_03.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_03.png new file mode 100644 index 000000000..bc8a6d2f9 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_03.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_04.2.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_04.2.png new file mode 100644 index 000000000..63db85403 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_04.2.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_04.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_04.png new file mode 100644 index 000000000..1e7054b44 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_04.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_05.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_05.png new file mode 100644 index 000000000..48943acaf Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_05.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_06.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_06.png new file mode 100644 index 000000000..6c21d4dcc Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_06.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_07.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_07.png new file mode 100644 index 000000000..86d80b4b6 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_07.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_08.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_08.png new file mode 100644 index 000000000..0a28cb113 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_08.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_09.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_09.png new file mode 100644 index 000000000..21737800c Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_09.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_10.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_10.png new file mode 100644 index 000000000..235f5eb8c Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_10.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_11.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_11.png new file mode 100644 index 000000000..7a8d7de78 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_11.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_12.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_12.png new file mode 100644 index 000000000..908dc7a3c Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_12.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_13.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_13.png new file mode 100644 index 000000000..f14e777c4 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_13.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_14.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_14.png new file mode 100644 index 000000000..57518d43d Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_14.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_15.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_15.png new file mode 100644 index 000000000..8b0ac0f79 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_15.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_16.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_16.png new file mode 100644 index 000000000..9225eec57 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_16.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_17.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_17.png new file mode 100644 index 000000000..78aa7e9cd Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_17.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_18.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_18.png new file mode 100644 index 000000000..4eee4fa3b Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_18.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_19.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_19.png new file mode 100644 index 000000000..5f1213233 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_19.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_20.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_20.png new file mode 100644 index 000000000..ace5e1b08 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_20.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_21.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_21.png new file mode 100644 index 000000000..9c652142e Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_21.png differ diff --git a/employee_bonus_manager/static/description/assets/screenshots/scrn_22.png b/employee_bonus_manager/static/description/assets/screenshots/scrn_22.png new file mode 100644 index 000000000..450782557 Binary files /dev/null and b/employee_bonus_manager/static/description/assets/screenshots/scrn_22.png differ diff --git a/employee_bonus_manager/static/description/banner.jpg b/employee_bonus_manager/static/description/banner.jpg new file mode 100644 index 000000000..8f4de2058 Binary files /dev/null and b/employee_bonus_manager/static/description/banner.jpg differ diff --git a/employee_bonus_manager/static/description/icon.png b/employee_bonus_manager/static/description/icon.png new file mode 100644 index 000000000..d48664529 Binary files /dev/null and b/employee_bonus_manager/static/description/icon.png differ diff --git a/employee_bonus_manager/static/description/index.html b/employee_bonus_manager/static/description/index.html new file mode 100644 index 000000000..2c50ad30c --- /dev/null +++ b/employee_bonus_manager/static/description/index.html @@ -0,0 +1,836 @@ + + + + + + + Odoo App 3 Index + + + + + + + + +
+
+
+
+
+ +
+
+
+ Community +
+
+
+
+
+
+

+ Employee Bonus

+

+ It Helps To Manage The Bonuses Of The Employees. +

+
+ +
+
+
+
+
+

Key Highlights +

+
+
+
+
+
+ +
+
+

Manage the employee bonuses.

+
+
+
+
+
+
+ +
+
+

The user, department head, or managers can + create the bonus request for the employees

+
+
+
+
+
+
+ +
+
+

The bonus will be approved + after the three level approvals.

+
+
+
+
+
+
+ +
+
+

The final approved bonus amount is + reimbursed in next payslip of the employee

+
+
+
+
+
+ +
+ +
+
+
+
+

+ There will be three user groups.

+
+ +
+
+

+ User with Billing access.

+
+
+ +
+
+

+ Department Head with Billing access.

+
+
+ +
+
+

+ Manager with Billing access.

+
+
+ +
+
+

+ User/Department head/Manager with Billing Administrator + access.

+
+
+
+
+
+
+ +
+
+

+ Separate menu for bonus reasons. Here, you can create bonus + reasons which has to be provided when creating the bonus + request.

+
+
+
+
+
+
+ +
+
+

+ The user can create and confirm bonus requests for the + employees.

+
+
+
+
+
+
+ +
+
+

+ Once it is submitted, the state will be changed to SUBMITTED + and the name of the submitted person and submitted date will + be recorded. Next, it has to be approved by the department + head/ manager.

+
+
+
+
+
+
+ +
+
+

+ If rejected, it will go to the REJECTED state. And if needed, it + can be reset to the DRAFT state.

+
+
+
+
+
+
+ +
+
+

+ Once the request is approved by the department head, it will + move on to the DEPARTMENT APPROVED state. + The name of the department head and approved date will + be recorded. Next, it has to be approved by the manager.

+
+
+
+
+
+
+ +
+
+

+ The manager can approve or reject the request.

+
+
+
+
+
+
+ +
+
+

+ Once the request is approved by the manager, it will move to the + MANAGER APPROVED state. + The name of the manager and approved date will be recorded. The + changes will also be visible in the chatter.

+
+
+
+
+
+
+ +
+
+

+ The accounting head can edit the Accounting Information and + click the ACCOUNTING HEAD APPROVAL (final approval)button to + post the journal entries.

+
+
+
+
+
+
+ +
+
+

+ Once the request is approved by the accounting + head, it will move to the ACCOUNTING HEAD APPROVED state.

+
+
+
+
+
+
+ + +
+
+

+ Now, we can see the corresponding journal entries for bonus + request by clicking Journal Items smart button.

+
+
+
+
+
+
+ +
+
+

+ The salary rule for bonus is loaded.

+
+
+
+
+
+
+ +
+
+

+ When calculating payslip for employee, the bonus amount is + loaded as Other Input for those who have the final approved + bonus + request for the dates of payslip.

+
+
+
+
+
+
+ +
+
+

+ When computing sheet, the bonus rule is taken account.

+
+
+
+
+
+
+ +
+
+

+ Separate menus will be available for viewing all bonus requests + and, the requests to be approved by the department and the + manager and accounting head. + The users can see only the All Requests menu and view their own + requests.

+
+
+
+
+
+
+ +
+
+

+ Department Approval menu will display all the confirmed bonus + requests which are ready for the Department approval.

+
+
+
+
+
+
+ +
+
+

+ Manager Approval menu will display all the confirmed bonus + requests which are ready for the Manager approval.

+
+
+
+
+
+
+ +
+
+

+ Accounting Head Approval menu will display all the manager + approved bonus + requests which are ready for the Accounting Head approval.

+
+
+
+ +
+
+
+
    +
  • + Easy to manage Employee Bonus. +
  • +
  • + Three user groups - User, Department Head and Manager. +
  • +
  • + User can create the bonus request for the employees. +
  • +
  • + Department head, Manager and Accounting head can approve or reject the requests. +
  • +
  • + The Accounting head approved bonus amount will reimburse in next payslip of employee. +
  • +
+
+
+
+
+
+
Version + 17.0.1.0.0|Released on:09th February 2024 +
+

+ + Initial Commit for Employee Bonus.

+
+
+
+
+
+
+
+

Related Products

+
+
+ +
+
+

Our Services

+ +
+
+
+
+
+
+
+
+ service-icon +
+
+

Odoo Customization

+
+
+
+
+
+
+ service-icon +
+
+

Odoo Implementation

+
+
+
+
+
+
+ service-icon +
+
+

Odoo Support

+
+
+
+
+
+
+ service-icon +
+
+

Hire Odoo Developer

+
+
+
+
+ +
+
+ service-icon +
+
+

Odoo Integration

+
+
+
+
+
+
+ service-icon +
+
+

Odoo Migration

+
+
+
+
+
+
+ service-icon +
+
+

Odoo Consultancy

+
+
+
+
+
+
+ service-icon +
+
+

Odoo Implementation

+
+
+
+
+
+
+ service-icon +
+
+

Odoo Licensing Consultancy

+
+
+
+
+
+
+

Our Industries

+ +
+
+
+
+
+
+ +

Trading

+

Easily procure and sell your products

+
+
+
+
+ +

POS

+

Easy configuration and convivial experience

+
+
+
+
+ +

Education

+

A platform for educational management

+
+
+
+
+ +

Manufacturing

+

Plan, track and schedule your operations

+
+
+
+
+ +

E-commerce & Website

+

Mobile friendly, awe-inspiring product pages

+
+
+
+
+ +

Service Management

+

Keep track of services and invoice

+
+
+
+
+ +

Restaurant

+

Run your bar or restaurant methodically

+
+
+
+
+ +

Hotel Management

+

An all-inclusive hotel management application

+
+
+
+
+
+
+

Support

+
+
+
+
+
+
+
+ +
+ Need + Help? +

Got questions or need help? Get in touch.

+
odoo@cybrosys.com +
+
+
+
+
+
+
+
+ +
+ WhatsApp +

Say hi to us on WhatsApp!

+
+91 + 99456767686
+
+
+
+
+
+
+
+
+ + + + + + diff --git a/employee_bonus_manager/views/bonus_reason_views.xml b/employee_bonus_manager/views/bonus_reason_views.xml new file mode 100644 index 000000000..1190a7f54 --- /dev/null +++ b/employee_bonus_manager/views/bonus_reason_views.xml @@ -0,0 +1,41 @@ + + + + + bonus.reason.view.tree + bonus.reason + + + + + + + + + bonus.reason.view.form + bonus.reason + +
+ +
+
+
+
+
+
+ + + Bonus Reasons + bonus.reason + + +

+ Add new bonus reasons +

+
+
+
diff --git a/employee_bonus_manager/views/bonus_request_views.xml b/employee_bonus_manager/views/bonus_request_views.xml new file mode 100644 index 000000000..74bf9bb3f --- /dev/null +++ b/employee_bonus_manager/views/bonus_request_views.xml @@ -0,0 +1,356 @@ + + + + + bonus.request.view.form + bonus.request + +
+
+ +
+ +
+ +
+

+ +

+

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + bonus.request.view.tree + bonus.request + + + + + + + + + + + + + + + + + + + + + + + bonus.request.view.kanban + bonus.request + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ +
+ +
+
+ + +
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+ + + bonus.request.view.graph + bonus.request + + + + + + + + + + bonus.request.view.pivot + bonus.request + + + + + + + + + + bonus.request.view.calendar + bonus.request + + + + + + + + + + + + + + + + + + + + + bonus.request.view.search + bonus.request + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bonus Requests + bonus.request + tree,kanban,graph,pivot,calendar,form + + +

+ Create new bonus request +

+
+
+ + + Department Approval + ir.actions.act_window + bonus.request + tree,kanban,graph,pivot,calendar,form + {'create': False} + [('state','=','submitted')] + + +

+ No requests found for department approval +

+
+
+ + + Manager Approval + ir.actions.act_window + bonus.request + tree,kanban,graph,pivot,calendar,form + {'create': False} + [('state','=','department_approved')] + + +

+ No requests found for Manager approval +

+
+
+ + + Accounting Head Approval + ir.actions.act_window + bonus.request + tree,kanban,graph,pivot,calendar,form + {'create': False} + [('state','=','manager_approved')] + + +

+ No requests found for Accounting Head +

+
+
+
diff --git a/employee_bonus_manager/views/employee_bonus_manager_menus.xml b/employee_bonus_manager/views/employee_bonus_manager_menus.xml new file mode 100644 index 000000000..38074da06 --- /dev/null +++ b/employee_bonus_manager/views/employee_bonus_manager_menus.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + +