diff --git a/hr_payroll_commission/models/hr_payslip.py b/hr_payroll_commission/models/hr_payslip.py index 510afdd7..0e6df68e 100644 --- a/hr_payroll_commission/models/hr_payslip.py +++ b/hr_payroll_commission/models/hr_payslip.py @@ -1,6 +1,6 @@ # Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. -from odoo import api, fields, models, _ +from odoo import api, Command, fields, models, _ class HrPayslip(models.Model): @@ -23,34 +23,41 @@ 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': - self.commission_payment_ids = self.env['hr.commission.payment'].search([ - ('employee_id', '=', self.employee_id.id), - ('pay_in_payslip', '=', True), - ('payslip_id', '=', False)]) - self._onchange_commission_payment_ids() + def action_refresh_from_work_entries(self): + res = super().action_refresh_from_work_entries() + for slip in self.filtered(lambda s: s.state in ('draft', 'verify')): + commission_payments = self.env['hr.commission.payment'].browse() + if slip.employee_id: + commission_payments = self.env['hr.commission.payment'].search([ + ('employee_id', '=', self.employee_id.id), + ('pay_in_payslip', '=', True), + ('payslip_id', '=', False)]) + slip.commission_payment_ids = commission_payments return res - @api.onchange('commission_payment_ids') - def _onchange_commission_payment_ids(self): + @api.depends('employee_id', 'contract_id', 'struct_id', 'date_from', 'date_to', 'struct_id', 'commission_payment_ids') + def _compute_input_line_ids(self): + res = super()._compute_input_line_ids() + commission_type = self.env.ref('hr_payroll_commission.commission_other_input', raise_if_not_found=False) if not commission_type: - return + return res - 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) - 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, - })) - self.update({'input_line_ids': input_lines_vals}) + for slip in self: + amount = sum(self.commission_payment_ids.mapped('commission_amount')) + if not amount: + continue + slip.update({ + 'input_line_ids': [ + Command.create({ + 'name': commission_type.name or 'Commission', + 'amount': amount, + 'input_type_id': commission_type.id, + }), + ], + }) + + return res def open_commissions(self): self.ensure_one() diff --git a/hr_payroll_commission/tests/test_payslip_commission.py b/hr_payroll_commission/tests/test_payslip_commission.py index 0e1dcc17..2e52ede9 100644 --- a/hr_payroll_commission/tests/test_payslip_commission.py +++ b/hr_payroll_commission/tests/test_payslip_commission.py @@ -7,6 +7,22 @@ from odoo.addons.hr_commission.tests import test_commission class TestCommissionPayslip(test_commission.TestCommission): + def _createContract(self, employee, commission_rate, admin_commission_rate=0.0): + return self.env['hr.contract'].create({ + 'date_start': '2016-01-01', + 'date_end': '2030-12-31', + 'name': 'Contract for tests', + 'wage': 1000.0, + 'wage_type': 'monthly', + # 'type_id': self.ref('hr_contract.hr_contract_type_emp'), + 'structure_type_id': self.ref('hr_contract.structure_type_worker'), + 'employee_id': employee.id, + 'resource_calendar_id': self.ref('resource.resource_calendar_std'), + 'commission_rate': commission_rate, + 'admin_commission_rate': admin_commission_rate, + 'state': 'open', # if not "Running" then no automatic selection when Payslip is created in 11.0 + }) + def test_commission(self): super().test_commission() commission_type = self.env.ref('hr_payroll_commission.commission_other_input') @@ -16,7 +32,7 @@ class TestCommissionPayslip(test_commission.TestCommission): 'date_from': date.today() - timedelta(days=1), 'date_to': date.today() + timedelta(days=14), }) - payslip._onchange_employee() + payslip.action_refresh_from_work_entries() self.assertFalse(payslip.commission_payment_ids) # find unpaid commission payments from super().test_commission() @@ -28,7 +44,7 @@ class TestCommissionPayslip(test_commission.TestCommission): # press the button to pay it via payroll commission_payments.action_report_in_next_payslip() - payslip._onchange_employee() + payslip.action_refresh_from_work_entries() # 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)