mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
Initial commit of hr_holidays_accrual and hr_holidays_accrual_payroll
This commit is contained in:
30
hr_holidays_accrual/README.rst
Normal file
30
hr_holidays_accrual/README.rst
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
***************************
|
||||||
|
Hibou - HR Holidays Accrual
|
||||||
|
***************************
|
||||||
|
|
||||||
|
Use Employee Tags to grant Leave Allocations.
|
||||||
|
|
||||||
|
For more information and add-ons, visit `Hibou.io <https://hibou.io/>`_.
|
||||||
|
|
||||||
|
=============
|
||||||
|
Main Features
|
||||||
|
=============
|
||||||
|
|
||||||
|
* Adds new boolean field `grant_by_tag` to Leave Allocations.
|
||||||
|
* Allows user to create a Leave Allocation by employee tag, then use that tag to grant the newly created leave to as many employees as desired.
|
||||||
|
|
||||||
|
.. image:: https://user-images.githubusercontent.com/15882954/42062226-cf3ce23e-7ae1-11e8-96dc-43268c7b904c.png
|
||||||
|
:alt: 'Equipment Detail'
|
||||||
|
:width: 988
|
||||||
|
:align: left
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=======
|
||||||
|
License
|
||||||
|
=======
|
||||||
|
|
||||||
|
Please see `LICENSE <https://github.com/hibou-io/hibou-odoo-suite/blob/11.0/LICENSE>`_.
|
||||||
|
|
||||||
|
Copyright Hibou Corp. 2018
|
||||||
1
hr_holidays_accrual/__init__.py
Executable file
1
hr_holidays_accrual/__init__.py
Executable file
@@ -0,0 +1 @@
|
|||||||
|
from . import models
|
||||||
18
hr_holidays_accrual/__manifest__.py
Executable file
18
hr_holidays_accrual/__manifest__.py
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
'name': 'HR Holidays Accrual',
|
||||||
|
'author': 'Hibou Corp. <hello@hibou.io>',
|
||||||
|
'version': '11.0.0.0.0',
|
||||||
|
'category': 'Human Resources',
|
||||||
|
'sequence': 95,
|
||||||
|
'summary': 'Grant leave allocations with tags',
|
||||||
|
'description': """
|
||||||
|
Create leave allocations by tag, then use tags to grant leaves to employees.
|
||||||
|
""",
|
||||||
|
'website': 'https://hibou.io/',
|
||||||
|
'depends': ['hr_holidays'],
|
||||||
|
'data': [
|
||||||
|
'views/hr_holidays_views.xml',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
'application': False,
|
||||||
|
}
|
||||||
1
hr_holidays_accrual/models/__init__.py
Normal file
1
hr_holidays_accrual/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import hr_holidays
|
||||||
54
hr_holidays_accrual/models/hr_holidays.py
Normal file
54
hr_holidays_accrual/models/hr_holidays.py
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class HRHolidays(models.Model):
|
||||||
|
_inherit = 'hr.holidays'
|
||||||
|
|
||||||
|
grant_by_tag = fields.Boolean(string="Grant by Tag")
|
||||||
|
|
||||||
|
def _accrue_for_employee_values(self, employee):
|
||||||
|
return {
|
||||||
|
'holiday_status_id': self.holiday_status_id.id,
|
||||||
|
'number_of_days_temp': self.number_of_days_temp,
|
||||||
|
'holiday_type': 'employee',
|
||||||
|
'employee_id': employee.id,
|
||||||
|
'type': 'add',
|
||||||
|
'state': 'confirm',
|
||||||
|
'double_validation': self.double_validation,
|
||||||
|
'grant_by_tag': self.grant_by_tag,
|
||||||
|
}
|
||||||
|
|
||||||
|
def accrue_for_employee(self, employee):
|
||||||
|
holidays = self.env['hr.holidays'].sudo()
|
||||||
|
for leave_to_create in self:
|
||||||
|
values = leave_to_create._accrue_for_employee_values(employee)
|
||||||
|
if values:
|
||||||
|
leave = holidays.create(values)
|
||||||
|
leave.action_approve()
|
||||||
|
|
||||||
|
|
||||||
|
class HREmployee(models.Model):
|
||||||
|
_inherit = 'hr.employee'
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def write(self, values):
|
||||||
|
holidays = self.env['hr.holidays'].sudo()
|
||||||
|
for emp in self:
|
||||||
|
if values.get('category_ids'):
|
||||||
|
categ_ids_command_list = values.get('category_ids')
|
||||||
|
for categ_ids_command in categ_ids_command_list:
|
||||||
|
ids = None
|
||||||
|
if categ_ids_command[0] == 6:
|
||||||
|
ids = set(categ_ids_command[2])
|
||||||
|
ids -= set(emp.category_ids.ids)
|
||||||
|
if categ_ids_command[0] == 4:
|
||||||
|
id = categ_ids_command[1]
|
||||||
|
if id not in emp.category_ids.ids:
|
||||||
|
ids = [id]
|
||||||
|
if ids:
|
||||||
|
# new category ids
|
||||||
|
leaves = holidays.search([('category_id', 'in', list(ids)),
|
||||||
|
('grant_by_tag', '=', True)])
|
||||||
|
leaves.accrue_for_employee(emp)
|
||||||
|
|
||||||
|
return super(HREmployee, self).write(values)
|
||||||
1
hr_holidays_accrual/tests/__init__.py
Executable file
1
hr_holidays_accrual/tests/__init__.py
Executable file
@@ -0,0 +1 @@
|
|||||||
|
from . import test_leaves
|
||||||
43
hr_holidays_accrual/tests/test_leaves.py
Normal file
43
hr_holidays_accrual/tests/test_leaves.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
from odoo.addons.hr_holidays.tests.common import TestHrHolidaysBase
|
||||||
|
|
||||||
|
|
||||||
|
class TestLeaves(TestHrHolidaysBase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestLeaves, self).setUp()
|
||||||
|
|
||||||
|
self.categ = self.env['hr.employee.category'].create({'name': 'Test Category'})
|
||||||
|
department = self.env['hr.department'].create({'name': 'Test Department'})
|
||||||
|
self.employee = self.env['hr.employee'].create({'name': 'Mark', 'department_id': department.id})
|
||||||
|
self.leave_type = self.env['hr.holidays.status'].create({
|
||||||
|
'name': 'Test Status',
|
||||||
|
'color_name': 'red',
|
||||||
|
})
|
||||||
|
self.test_leave = self.env['hr.holidays'].create({
|
||||||
|
'holiday_status_id': self.leave_type.id,
|
||||||
|
'number_of_days_temp': 5,
|
||||||
|
'holiday_type': 'category',
|
||||||
|
'category_id': self.categ.id,
|
||||||
|
'type': 'add',
|
||||||
|
'state': 'draft',
|
||||||
|
'grant_by_tag': True,
|
||||||
|
})
|
||||||
|
|
||||||
|
def test_tag_assignment(self):
|
||||||
|
self.test_leave.action_confirm()
|
||||||
|
self.test_leave.action_approve()
|
||||||
|
self.assertEqual(self.employee.leaves_count, 0.0)
|
||||||
|
self.employee.write({'category_ids': [(6, False, [self.categ.id])]})
|
||||||
|
self.assertEqual(self.employee.leaves_count, 5.0)
|
||||||
|
leave = self.env['hr.holidays'].search([('employee_id', '=', self.employee.id)])
|
||||||
|
self.assertEqual(leave.holiday_status_id.id, self.leave_type.id)
|
||||||
|
|
||||||
|
def test_double_validation(self):
|
||||||
|
self.test_leave.write({'double_validation': True})
|
||||||
|
self.test_leave.action_confirm()
|
||||||
|
self.test_leave.action_approve()
|
||||||
|
self.test_leave.action_validate()
|
||||||
|
self.employee.write({'category_ids': [(6, False, [self.categ.id])]})
|
||||||
|
leave = self.env['hr.holidays'].search([('employee_id', '=', self.employee.id)])
|
||||||
|
self.assertEqual(leave.state, 'validate1')
|
||||||
|
self.assertEqual(leave.first_approver_id.id, self.env.uid)
|
||||||
13
hr_holidays_accrual/views/hr_holidays_views.xml
Normal file
13
hr_holidays_accrual/views/hr_holidays_views.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<record id="hr_holidays_edit_holiday_new_inherit" model="ir.ui.view">
|
||||||
|
<field name="name">hr.holidays.edit.holiday.new.inherit</field>
|
||||||
|
<field name="model">hr.holidays</field>
|
||||||
|
<field name="inherit_id" ref="hr_holidays.edit_holiday_new"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='category_id']" position="after">
|
||||||
|
<field name="grant_by_tag" attrs="{'invisible': [('holiday_type', '=', 'employee')]}"/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
30
hr_holidays_accrual_payroll/README.rst
Normal file
30
hr_holidays_accrual_payroll/README.rst
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
*************************************
|
||||||
|
Hibou - HR Holidays Accrual - Payroll
|
||||||
|
*************************************
|
||||||
|
|
||||||
|
Accrue employee leave allocations every pay period.
|
||||||
|
|
||||||
|
For more information and add-ons, visit `Hibou.io <https://hibou.io/>`_.
|
||||||
|
|
||||||
|
=============
|
||||||
|
Main Features
|
||||||
|
=============
|
||||||
|
|
||||||
|
* New Fields `accrue_by_pay_period` and `allocation_per_pay_period` on Leave allocations.
|
||||||
|
* Can set up an accrual by individual employee, or make an Allocation by Employee Tag for multiple employees.
|
||||||
|
|
||||||
|
|
||||||
|
.. image:: https://user-images.githubusercontent.com/15882954/42062853-f4175416-7ae3-11e8-8432-f54e26fe6094.png
|
||||||
|
:alt: 'Equipment Detail'
|
||||||
|
:width: 988
|
||||||
|
:align: left
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=======
|
||||||
|
License
|
||||||
|
=======
|
||||||
|
|
||||||
|
Please see `LICENSE <https://github.com/hibou-io/hibou-odoo-suite/blob/11.0/LICENSE>`_.
|
||||||
|
|
||||||
|
Copyright Hibou Corp. 2018
|
||||||
1
hr_holidays_accrual_payroll/__init__.py
Executable file
1
hr_holidays_accrual_payroll/__init__.py
Executable file
@@ -0,0 +1 @@
|
|||||||
|
from . import models
|
||||||
21
hr_holidays_accrual_payroll/__manifest__.py
Executable file
21
hr_holidays_accrual_payroll/__manifest__.py
Executable file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
'name': 'HR Holidays Accrual - Payroll',
|
||||||
|
'author': 'Hibou Corp. <hello@hibou.io>',
|
||||||
|
'version': '11.0.0.0.0',
|
||||||
|
'category': 'Human Resources',
|
||||||
|
'sequence': 95,
|
||||||
|
'summary': 'Grant leave allocations per payperiod',
|
||||||
|
'description': """
|
||||||
|
Automates leave allocations.
|
||||||
|
""",
|
||||||
|
'website': 'https://hibou.io/',
|
||||||
|
'depends': [
|
||||||
|
'hr_holidays_accrual',
|
||||||
|
'hr_payroll'
|
||||||
|
],
|
||||||
|
'data': [
|
||||||
|
'views/hr_holidays_views.xml',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
'application': False,
|
||||||
|
}
|
||||||
1
hr_holidays_accrual_payroll/models/__init__.py
Normal file
1
hr_holidays_accrual_payroll/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import hr_payslip
|
||||||
32
hr_holidays_accrual_payroll/models/hr_payslip.py
Normal file
32
hr_holidays_accrual_payroll/models/hr_payslip.py
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class HRPayslip(models.Model):
|
||||||
|
_inherit = 'hr.payslip'
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def action_payslip_done(self):
|
||||||
|
res = super(HRPayslip, self).action_payslip_done()
|
||||||
|
if res and isinstance(res, (int, bool)):
|
||||||
|
holidays = self.env['hr.holidays'].sudo()
|
||||||
|
leaves_to_update = holidays.search([('employee_id', '=', self.employee_id.id),
|
||||||
|
('accrue_by_pay_period', '=', True)])
|
||||||
|
for leave_to_update in leaves_to_update:
|
||||||
|
new_allocation = leave_to_update.number_of_days_temp + leave_to_update.allocation_per_period
|
||||||
|
leave_to_update.write({'number_of_days_temp': new_allocation})
|
||||||
|
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
class HRHolidays(models.Model):
|
||||||
|
_inherit = 'hr.holidays'
|
||||||
|
|
||||||
|
accrue_by_pay_period = fields.Boolean(string="Accrue by Pay Period")
|
||||||
|
allocation_per_period = fields.Float(string="Allocation Per Pay Period", digits=(12, 4))
|
||||||
|
|
||||||
|
def _accrue_for_employee_values(self, employee):
|
||||||
|
values = super(HRHolidays, self)._accrue_for_employee_values(employee)
|
||||||
|
if values:
|
||||||
|
values['accrue_by_pay_period'] = self.accrue_by_pay_period
|
||||||
|
values['allocation_per_period'] = self.allocation_per_period
|
||||||
|
return values
|
||||||
1
hr_holidays_accrual_payroll/tests/__init__.py
Executable file
1
hr_holidays_accrual_payroll/tests/__init__.py
Executable file
@@ -0,0 +1 @@
|
|||||||
|
from . import test_accrual
|
||||||
43
hr_holidays_accrual_payroll/tests/test_accrual.py
Normal file
43
hr_holidays_accrual_payroll/tests/test_accrual.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
from odoo.addons.hr_holidays.tests.common import TestHrHolidaysBase
|
||||||
|
|
||||||
|
|
||||||
|
class TestLeaves(TestHrHolidaysBase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestLeaves, self).setUp()
|
||||||
|
|
||||||
|
self.categ = self.env['hr.employee.category'].create({'name': 'Test Category'})
|
||||||
|
department = self.env['hr.department'].create({'name': 'Test Department'})
|
||||||
|
self.employee = self.env['hr.employee'].create({'name': 'Mark', 'department_id': department.id})
|
||||||
|
self.leave_type = self.env['hr.holidays.status'].create({
|
||||||
|
'name': 'Test Status',
|
||||||
|
'color_name': 'red',
|
||||||
|
})
|
||||||
|
self.test_leave = self.env['hr.holidays'].create({
|
||||||
|
'holiday_status_id': self.leave_type.id,
|
||||||
|
'number_of_days_temp': 0,
|
||||||
|
'holiday_type': 'category',
|
||||||
|
'category_id': self.categ.id,
|
||||||
|
'type': 'add',
|
||||||
|
'state': 'draft',
|
||||||
|
'grant_by_tag': True,
|
||||||
|
})
|
||||||
|
|
||||||
|
def test_payslip_accrual(self):
|
||||||
|
self.test_leave.write({
|
||||||
|
'accrue_by_pay_period': True,
|
||||||
|
'allocation_per_period': 1
|
||||||
|
})
|
||||||
|
self.test_leave.action_confirm()
|
||||||
|
self.test_leave.action_approve()
|
||||||
|
|
||||||
|
self.employee.write({'category_ids': [(6, False, [self.categ.id])]})
|
||||||
|
self.assertEqual(self.employee.leaves_count, 0.0)
|
||||||
|
|
||||||
|
payslip = self.env['hr.payslip'].create({
|
||||||
|
'employee_id': self.employee.id,
|
||||||
|
'date_from': '2018-01-01',
|
||||||
|
'date_to': '2018-01-31'
|
||||||
|
})
|
||||||
|
payslip.action_payslip_done()
|
||||||
|
self.assertEqual(self.employee.leaves_count, 1.0)
|
||||||
14
hr_holidays_accrual_payroll/views/hr_holidays_views.xml
Normal file
14
hr_holidays_accrual_payroll/views/hr_holidays_views.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<record id="hr_holidays_edit_holiday_new_inherit_pay" model="ir.ui.view">
|
||||||
|
<field name="name">hr.holidays.edit.holiday.new.inherit.pay</field>
|
||||||
|
<field name="model">hr.holidays</field>
|
||||||
|
<field name="inherit_id" ref="hr_holidays.edit_holiday_new"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='category_id']" position="after">
|
||||||
|
<field name="accrue_by_pay_period"/>
|
||||||
|
<field name="allocation_per_period"/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
Reference in New Issue
Block a user