From 7843d1a11e35b0ee948370437ba214c92748bc75 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Tue, 22 Mar 2022 17:01:12 +0000 Subject: [PATCH 1/3] [FIX] hr_commission,hr_payroll_commission: fix linking commission payment Additionally `hr_commission`: test archive contracts in case someone moves one to running --- hr_commission/tests/test_commission.py | 2 + hr_commission/views/account_views.xml | 4 +- hr_payroll_commission/__manifest__.py | 2 +- hr_payroll_commission/models/hr_payslip.py | 70 ++++++++++--------- .../tests/test_payslip_commission.py | 9 ++- 5 files changed, 49 insertions(+), 38 deletions(-) diff --git a/hr_commission/tests/test_commission.py b/hr_commission/tests/test_commission.py index 1d15ef70..021652e7 100644 --- a/hr_commission/tests/test_commission.py +++ b/hr_commission/tests/test_commission.py @@ -10,6 +10,8 @@ class TestCommission(common.TransactionCase): 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. + # arcive all current contracts + self.employee.contract_ids.write({'active': False}) def _createUser(self): return self.env['res.users'].create({ diff --git a/hr_commission/views/account_views.xml b/hr_commission/views/account_views.xml index ec9e4836..a0a100d9 100644 --- a/hr_commission/views/account_views.xml +++ b/hr_commission/views/account_views.xml @@ -20,8 +20,8 @@ account.journal - - {'required': [('type', '=', 'purchase')], 'invisible': [('type', 'not in', ('purchase', 'general'))]} + + diff --git a/hr_payroll_commission/__manifest__.py b/hr_payroll_commission/__manifest__.py index 54ff434e..fd9f631d 100644 --- a/hr_payroll_commission/__manifest__.py +++ b/hr_payroll_commission/__manifest__.py @@ -13,7 +13,7 @@ Reimburse Commissions in Payslips """, 'depends': [ 'hr_commission', - 'hr_payroll', + 'hr_payroll_hibou', ], 'data': [ 'views/hr_commission_views.xml', diff --git a/hr_payroll_commission/models/hr_payslip.py b/hr_payroll_commission/models/hr_payslip.py index 0e6df68e..dbd1b1e6 100644 --- a/hr_payroll_commission/models/hr_payslip.py +++ b/hr_payroll_commission/models/hr_payslip.py @@ -17,47 +17,51 @@ class HrPayslip(models.Model): for payslip in self: payslip.commission_count = len(payslip.mapped('commission_payment_ids.commission_ids')) - @api.onchange('input_line_ids') - def _onchange_input_line_ids(self): - commission_type = self.env.ref('hr_payroll_commission.commission_other_input', raise_if_not_found=False) - if not self.input_line_ids.filtered(lambda line: line.input_type_id == commission_type): - self.commission_payment_ids.write({'payslip_id': False}) + @api.model_create_multi + def create(self, vals_list): + payslips = super().create(vals_list) + draft_slips = payslips.filtered(lambda p: p.employee_id and p.state == 'draft') + if not draft_slips: + return payslips + + commission_payments = self.env['hr.commission.payment'].search([ + ('employee_id', 'in', draft_slips.mapped('employee_id').ids), + ('pay_in_payslip', '=', True), + ('payslip_id', '=', False)]) + for slip in draft_slips: + payslip_commission_payments = commission_payments.filtered(lambda c: c.employee_id == slip.employee_id) + slip.commission_payment_ids = [(5, 0, 0)] + [(4, c.id, False) for c in payslip_commission_payments] + return payslips - 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 + def write(self, vals): + res = super().write(vals) + if 'commission_payment_ids' in vals: + self._compute_commission_input_line_ids() + if 'input_line_ids' in vals: + self._update_commission() return res + + def _update_commission(self): + commission_type = self.env.ref('hr_payroll_commission.commission_other_input', raise_if_not_found=False) + for payslip in self: + if not payslip.input_line_ids.filtered(lambda line: line.input_type_id == commission_type): + payslip.commission_payment_ids.write({'payslip_id': False}) - @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() - + def _compute_commission_input_line_ids(self): commission_type = self.env.ref('hr_payroll_commission.commission_other_input', raise_if_not_found=False) if not commission_type: - return res - - for slip in self: + return + for payslip 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 + lines_to_remove = payslip.input_line_ids.filtered(lambda x: x.input_type_id == commission_type) + input_lines_vals = [(2, line.id, False) for line in lines_to_remove] + input_lines_vals.append((0, 0, { + 'amount': amount, + 'input_type_id': commission_type.id + })) + payslip.update({'input_line_ids': input_lines_vals}) 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 2e52ede9..ee0526a3 100644 --- a/hr_payroll_commission/tests/test_payslip_commission.py +++ b/hr_payroll_commission/tests/test_payslip_commission.py @@ -32,8 +32,8 @@ class TestCommissionPayslip(test_commission.TestCommission): 'date_from': date.today() - timedelta(days=1), 'date_to': date.today() + timedelta(days=14), }) - payslip.action_refresh_from_work_entries() self.assertFalse(payslip.commission_payment_ids) + payslip.action_payslip_cancel() # find unpaid commission payments from super().test_commission() commission_payments = self.env['hr.commission.payment'].search([ @@ -44,7 +44,12 @@ class TestCommissionPayslip(test_commission.TestCommission): # press the button to pay it via payroll commission_payments.action_report_in_next_payslip() - payslip.action_refresh_from_work_entries() + 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), + }) # 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) From 941807a36a7fbc943c7420f4d1c16477e92cdbba Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Tue, 22 Mar 2022 17:24:54 +0000 Subject: [PATCH 2/3] [IMP] hr_payroll_commission: add payslip to tree view --- hr_payroll_commission/views/hr_commission_views.xml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/hr_payroll_commission/views/hr_commission_views.xml b/hr_payroll_commission/views/hr_commission_views.xml index cbc1cb27..17e88c36 100644 --- a/hr_payroll_commission/views/hr_commission_views.xml +++ b/hr_payroll_commission/views/hr_commission_views.xml @@ -2,7 +2,7 @@ - hr.expense.sheet.view.form.payroll + hr.commission.payment.form.payroll hr.commission.payment @@ -20,4 +20,15 @@ + + hr.commission.payment.tree.payroll + hr.commission.payment + + + + + + + + From da1a2a3f20f9cdf1f3c80bb988e232b448a0997d Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Tue, 22 Mar 2022 17:52:12 +0000 Subject: [PATCH 3/3] [IM] hr_payroll_commission: display eligible to go onto payroll in tree --- hr_payroll_commission/views/hr_commission_views.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/hr_payroll_commission/views/hr_commission_views.xml b/hr_payroll_commission/views/hr_commission_views.xml index 17e88c36..291ecc9a 100644 --- a/hr_payroll_commission/views/hr_commission_views.xml +++ b/hr_payroll_commission/views/hr_commission_views.xml @@ -26,6 +26,7 @@ +