From c4707137091c748035787d63205dcdf73903a119 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Thu, 8 Apr 2021 09:29:12 -0700 Subject: [PATCH] [MIG] hr_payroll_commission: Backport to Odoo 12.0 Additionally, improved tests in `hr_commission` due to payroll installing a contract. --- hr_commission/tests/test_commission.py | 18 ++++++++++++++++-- hr_payroll_commission/__manifest__.py | 3 +-- .../data/hr_payroll_commission_data.xml | 9 --------- .../data/hr_payroll_commission_demo.xml | 7 +++++-- hr_payroll_commission/models/hr_payslip.py | 18 +++++++++--------- .../tests/test_payslip_commission.py | 8 ++++---- 6 files changed, 35 insertions(+), 28 deletions(-) delete mode 100644 hr_payroll_commission/data/hr_payroll_commission_data.xml diff --git a/hr_commission/tests/test_commission.py b/hr_commission/tests/test_commission.py index b42c8e1f..8e2e4d02 100644 --- a/hr_commission/tests/test_commission.py +++ b/hr_commission/tests/test_commission.py @@ -5,6 +5,11 @@ from odoo.tests import common class TestCommission(common.TransactionCase): + def setUp(self): + super().setUp() + self.user = self.browse_ref('base.user_demo') + self.employee = self.browse_ref('hr.employee_qdp') # This is the employee associated with above user. + def _createUser(self): return self.env['res.users'].create({ 'name': 'Coach', @@ -23,6 +28,12 @@ class TestCommission(common.TransactionCase): }) def _createContract(self, employee, commission_rate, admin_commission_rate=0.0): + other_contracts = self.env['hr.contract'].search([('employee_id', '=', employee.id)]) + if other_contracts: + # couldn't get the demo contract to not be used if it is + # installed e.g. by payroll... + # tried, state->cancel + employee.invalidate_cache() etc. + other_contracts.unlink() return self.env['hr.contract'].create({ 'date_start': '2016-01-01', 'date_end': '2030-12-31', @@ -47,8 +58,8 @@ class TestCommission(common.TransactionCase): coach = self._createEmployee(self.browse_ref('base.user_root')) coach_contract = self._createContract(coach, 12.0, admin_commission_rate=2.0) - user = self.browse_ref('base.user_demo') - emp = self.browse_ref('hr.employee_qdp') # This is the employee associated with above user. + user = self.user + emp = self.employee emp.address_home_id = user.partner_id # Important field for payables. emp.coach_id = coach @@ -62,9 +73,12 @@ class TestCommission(common.TransactionCase): inv.action_invoice_open() # validate self.assertEqual(inv.state, 'open') self.assertTrue(inv.commission_ids, 'Commissions not created when invoice is validated.') + self.assertTrue(inv.amount_for_commission()) user_commission = inv.commission_ids.filtered(lambda c: c.employee_id.id == emp.id) self.assertEqual(len(user_commission), 1, 'Incorrect commission count %d (expect 1)' % len(user_commission)) + self.assertTrue(user_commission.rate) + self.assertTrue(user_commission.amount) self.assertEqual(user_commission.state, 'draft', 'Commission is not draft.') self.assertFalse(user_commission.move_id, 'Commission has existing journal entry.') diff --git a/hr_payroll_commission/__manifest__.py b/hr_payroll_commission/__manifest__.py index 7ac30f0c..00e2cb32 100644 --- a/hr_payroll_commission/__manifest__.py +++ b/hr_payroll_commission/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Commissions in Payslips', 'author': 'Hibou Corp.', - 'version': '13.0.1.0.0', + 'version': '12.0.1.0.0', 'license': 'OPL-1', 'category': 'Accounting/Commissions', 'sequence': 95, @@ -18,7 +18,6 @@ Reimburse Commissions in Payslips 'data': [ 'views/hr_commission_views.xml', 'views/hr_payslip_views.xml', - 'data/hr_payroll_commission_data.xml', ], 'demo': [ 'data/hr_payroll_commission_demo.xml', diff --git a/hr_payroll_commission/data/hr_payroll_commission_data.xml b/hr_payroll_commission/data/hr_payroll_commission_data.xml deleted file mode 100644 index a666f821..00000000 --- a/hr_payroll_commission/data/hr_payroll_commission_data.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Commissions - COMMISSION - - - diff --git a/hr_payroll_commission/data/hr_payroll_commission_demo.xml b/hr_payroll_commission/data/hr_payroll_commission_demo.xml index 77e8ccfa..b7d42acd 100644 --- a/hr_payroll_commission/data/hr_payroll_commission_demo.xml +++ b/hr_payroll_commission/data/hr_payroll_commission_demo.xml @@ -13,8 +13,11 @@ result = inputs.COMMISSION.amount if inputs.COMMISSION else 0 COMMISSION Commissions - - + + + + + diff --git a/hr_payroll_commission/models/hr_payslip.py b/hr_payroll_commission/models/hr_payslip.py index 510afdd7..814a2644 100644 --- a/hr_payroll_commission/models/hr_payslip.py +++ b/hr_payroll_commission/models/hr_payslip.py @@ -23,10 +23,10 @@ class HrPayslip(models.Model): if not self.input_line_ids.filtered(lambda line: line.input_type_id == commission_type): self.commission_payment_ids.write({'payslip_id': False}) - @api.onchange('employee_id', 'struct_id', 'contract_id', 'date_from', 'date_to') - def _onchange_employee(self): - res = super()._onchange_employee() - if self.state == 'draft': + @api.onchange('employee_id', 'date_from', 'date_to', 'contract_id') + def onchange_employee(self): + res = super().onchange_employee() + if self.state == 'draft' and self.contract_id: self.commission_payment_ids = self.env['hr.commission.payment'].search([ ('employee_id', '=', self.employee_id.id), ('pay_in_payslip', '=', True), @@ -36,19 +36,19 @@ class HrPayslip(models.Model): @api.onchange('commission_payment_ids') def _onchange_commission_payment_ids(self): - commission_type = self.env.ref('hr_payroll_commission.commission_other_input', raise_if_not_found=False) - if not commission_type: - return + commission_code = 'COMMISSION' total = sum(self.commission_payment_ids.mapped('commission_amount')) if not total: return - lines_to_keep = self.input_line_ids.filtered(lambda x: x.input_type_id != commission_type) + lines_to_keep = self.input_line_ids.filtered(lambda x: x.code != commission_code) input_lines_vals = [(5, 0, 0)] + [(4, line.id, False) for line in lines_to_keep] input_lines_vals.append((0, 0, { 'amount': total, - 'input_type_id': commission_type.id, + 'name': 'Commissions', + 'code': commission_code, + 'contract_id': self.contract_id.id, })) self.update({'input_line_ids': input_lines_vals}) diff --git a/hr_payroll_commission/tests/test_payslip_commission.py b/hr_payroll_commission/tests/test_payslip_commission.py index 0e1dcc17..ce188757 100644 --- a/hr_payroll_commission/tests/test_payslip_commission.py +++ b/hr_payroll_commission/tests/test_payslip_commission.py @@ -9,14 +9,14 @@ class TestCommissionPayslip(test_commission.TestCommission): def test_commission(self): super().test_commission() - commission_type = self.env.ref('hr_payroll_commission.commission_other_input') + commission_code = 'COMMISSION' payslip = self.env['hr.payslip'].create({ 'name': 'test slip', 'employee_id': self.employee.id, 'date_from': date.today() - timedelta(days=1), 'date_to': date.today() + timedelta(days=14), }) - payslip._onchange_employee() + payslip.onchange_employee() self.assertFalse(payslip.commission_payment_ids) # find unpaid commission payments from super().test_commission() @@ -28,10 +28,10 @@ class TestCommissionPayslip(test_commission.TestCommission): # press the button to pay it via payroll commission_payments.action_report_in_next_payslip() - payslip._onchange_employee() + payslip.onchange_employee() # has attached commission payments self.assertTrue(payslip.commission_payment_ids) - commission_input_lines = payslip.input_line_ids.filtered(lambda l: l.input_type_id == commission_type) + commission_input_lines = payslip.input_line_ids.filtered(lambda l: l.code == commission_code) self.assertTrue(commission_input_lines) self.assertEqual(sum(commission_input_lines.mapped('amount')), sum(commission_payments.mapped('commission_amount')))