diff --git a/hr_payroll_hibou/__manifest__.py b/hr_payroll_hibou/__manifest__.py index 94ba5190..3c074c14 100644 --- a/hr_payroll_hibou/__manifest__.py +++ b/hr_payroll_hibou/__manifest__.py @@ -18,6 +18,7 @@ Base module for fixing specific qwerks or assumptions in the way Payroll Odoo En """, 'data': [ + 'views/hr_contract_views.xml', 'views/res_config_settings_views.xml', ], 'demo': [ diff --git a/hr_payroll_hibou/models/__init__.py b/hr_payroll_hibou/models/__init__.py index 4538599a..ecd8aaf0 100644 --- a/hr_payroll_hibou/models/__init__.py +++ b/hr_payroll_hibou/models/__init__.py @@ -1,4 +1,5 @@ from . import browsable_object +from . import hr_contract from . import hr_payslip from . import hr_salary_rule from . import res_config_settings diff --git a/hr_payroll_hibou/models/hr_contract.py b/hr_payroll_hibou/models/hr_contract.py new file mode 100644 index 00000000..165c45ed --- /dev/null +++ b/hr_payroll_hibou/models/hr_contract.py @@ -0,0 +1,20 @@ +from odoo import fields, models + + +class HrContract(models.Model): + _inherit = 'hr.contract' + + wage_type = fields.Selection([('monthly', 'Period Fixed Wage'), ('hourly', 'Hourly Wage')], + default='monthly', required=True, related=False) + + def _get_contract_wage(self, work_type=None): + # Override if you pay differently for different work types + # In 14.0, this utilizes new computed field mechanism, + # but will still get the 'wage' field by default. + self.ensure_one() + return self[self._get_contract_wage_field(work_type=work_type)] + + def _get_contract_wage_field(self, work_type=None): + if self.wage_type == 'hourly': + return 'hourly_wage' + return super()._get_contract_wage_field() diff --git a/hr_payroll_hibou/models/hr_payslip.py b/hr_payroll_hibou/models/hr_payslip.py index 1a3ffffc..fab438f5 100644 --- a/hr_payroll_hibou/models/hr_payslip.py +++ b/hr_payroll_hibou/models/hr_payslip.py @@ -6,9 +6,22 @@ from odoo import fields, models class HrPayslip(models.Model): _inherit = 'hr.payslip' + # We need to be able to support more complexity, + # namely, that different employees will be paid by different wage types as 'salary' vs 'hourly' + wage_type = fields.Selection(related='contract_id.wage_type') + def get_year(self): """ # Helper method to get the year (normalized between Odoo Versions) :return: int year of payslip """ return self.date_to.year + + def _get_contract_wage(self, work_type=None): + # Override if you pay differently for different work types + # In 14.0, this utilizes new computed field mechanism, + # but will still get the 'wage' field by default. + + # This would be a good place to override though with a 'work type' + # based mechanism, like a minimum rate or 'rate card' implementation + return self.contract_id._get_contract_wage(work_type=work_type) diff --git a/hr_payroll_hibou/models/res_config_settings.py b/hr_payroll_hibou/models/res_config_settings.py index 9d47b99e..d282e2a7 100644 --- a/hr_payroll_hibou/models/res_config_settings.py +++ b/hr_payroll_hibou/models/res_config_settings.py @@ -7,6 +7,8 @@ class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' # TODO We need MORE here... + module_hr_payroll_attendance = fields.Boolean(string='Attendance Entries & Overtime') + module_hr_payroll_timesheet = fields.Boolean(string='Timesheet Entries & Overtime') module_l10n_us_hr_payroll = fields.Boolean(string='USA Payroll') module_l10n_us_hr_payroll_401k = fields.Boolean(string='USA Payroll 401k') diff --git a/hr_payroll_hibou/tests/__init__.py b/hr_payroll_hibou/tests/__init__.py index cf74eea4..45ce36c6 100644 --- a/hr_payroll_hibou/tests/__init__.py +++ b/hr_payroll_hibou/tests/__init__.py @@ -2,4 +2,5 @@ from . import common +from . import test_contract_wage_type from . import test_special diff --git a/hr_payroll_hibou/tests/common.py b/hr_payroll_hibou/tests/common.py index d1423abe..00a3564b 100755 --- a/hr_payroll_hibou/tests/common.py +++ b/hr_payroll_hibou/tests/common.py @@ -10,16 +10,21 @@ from odoo.tools.float_utils import float_round as odoo_float_round def process_payslip(payslip): try: - payslip.action_payslip_done() + return payslip.action_payslip_done() except AttributeError: # v9 - payslip.process_sheet() + return payslip.process_sheet() class TestPayslip(common.TransactionCase): debug = False _logger = getLogger(__name__) + def process_payslip(self, payslip=None): + if not payslip: + return process_payslip(self.payslip) + return process_payslip(payslip) + def setUp(self): super(TestPayslip, self).setUp() self.contract_model = self.env['hr.contract'] diff --git a/hr_payroll_hibou/tests/test_contract_wage_type.py b/hr_payroll_hibou/tests/test_contract_wage_type.py new file mode 100644 index 00000000..5908f8b5 --- /dev/null +++ b/hr_payroll_hibou/tests/test_contract_wage_type.py @@ -0,0 +1,26 @@ +from .common import TestPayslip, process_payslip + + +class TestContractWageType(TestPayslip): + + def test_per_contract_wage_type_salary(self): + self.debug = True + salary = 80000.0 + employee = self._createEmployee() + contract = self._createContract(employee, wage=salary, hourly_wage=salary/100.0, wage_type='monthly', schedule_pay='bi-weekly') + payslip = self._createPayslip(employee, '2019-12-30', '2020-01-12') + self.assertEqual(contract.wage_type, 'monthly') + self.assertEqual(payslip.wage_type, 'monthly') + cats = self._getCategories(payslip) + self.assertEqual(cats['BASIC'], salary) + + def test_per_contract_wage_type_hourly(self): + self.debug = True + hourly_wage = 21.50 + employee = self._createEmployee() + contract = self._createContract(employee, wage=hourly_wage*100.0, hourly_wage=hourly_wage, wage_type='hourly', schedule_pay='bi-weekly') + payslip = self._createPayslip(employee, '2019-12-30', '2020-01-12') + self.assertEqual(contract.wage_type, 'hourly') + self.assertEqual(payslip.wage_type, 'hourly') + cats = self._getCategories(payslip) + self.assertEqual(cats['BASIC'], hourly_wage * 80.0) diff --git a/hr_payroll_hibou/views/hr_contract_views.xml b/hr_payroll_hibou/views/hr_contract_views.xml new file mode 100755 index 00000000..38934065 --- /dev/null +++ b/hr_payroll_hibou/views/hr_contract_views.xml @@ -0,0 +1,22 @@ + + + + + hr.contract.form.inherit + hr.contract + 20 + + + + + + {} + + + Period Advantages in Cash + + + + + + diff --git a/hr_payroll_hibou/views/res_config_settings_views.xml b/hr_payroll_hibou/views/res_config_settings_views.xml index 65c3bd51..9933edbd 100644 --- a/hr_payroll_hibou/views/res_config_settings_views.xml +++ b/hr_payroll_hibou/views/res_config_settings_views.xml @@ -32,6 +32,7 @@