Initial commit of hr_holidays_accrual and hr_holidays_accrual_payroll

This commit is contained in:
Kristen Marie Kulha
2018-07-12 16:04:20 -07:00
parent e9ddffa03c
commit db2fd55388
16 changed files with 304 additions and 0 deletions

View 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

View File

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

View 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,
}

View File

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

View 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)

View File

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

View 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)

View 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>

View 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

View File

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

View 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,
}

View File

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

View 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

View File

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

View 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)

View 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>