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 @@
+
+