From 9b0278002c2f3d671e3721c7928ef3f2f91ef88b Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Tue, 1 Feb 2022 14:08:06 -0800 Subject: [PATCH 1/2] [IMP] hr_commission: extended ahead of timesheet based commission * Allow invoice to see commission it is deriving amount for. This allows for basing on amounts that may depend on the employee or contract config. * Prevent making commissions if the employee rate or admin rates are not set. * Updated views to work in both CE and EE --- hr_commission/models/account.py | 2 +- hr_commission/models/commission.py | 8 +++--- hr_commission/views/commission_views.xml | 31 +++++++++++++++++------- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/hr_commission/models/account.py b/hr_commission/models/account.py index 6180d014..1048faa1 100644 --- a/hr_commission/models/account.py +++ b/hr_commission/models/account.py @@ -36,7 +36,7 @@ class AccountMove(models.Model): self.env['hr.commission'].invoice_paid(self) return res - def amount_for_commission(self): + def amount_for_commission(self, commission=None): if hasattr(self, 'margin') and self.company_id.commission_amount_type == 'on_invoice_margin': sign = -1 if self.move_type in ['in_refund', 'out_refund'] else 1 return self.margin * sign diff --git a/hr_commission/models/commission.py b/hr_commission/models/commission.py index ccb4c0a8..59219090 100644 --- a/hr_commission/models/commission.py +++ b/hr_commission/models/commission.py @@ -71,14 +71,14 @@ class Commission(models.Model): elif commission.contract_id and commission.rate_type != 'manual': if commission.rate_type == 'normal': commission.rate = commission.contract_id.commission_rate - else: + elif commission.rate_type == 'admin': commission.rate = commission.contract_id.admin_commission_rate rounding = 2 if commission.source_move_id: rounding = commission.source_move_id.company_currency_id.rounding commission.base_total = commission.source_move_id.amount_total_signed - commission.base_amount = commission.source_move_id.amount_for_commission() + commission.base_amount = commission.source_move_id.amount_for_commission(commission) amount = (commission.base_amount * commission.rate) / 100.0 if float_is_zero(amount, precision_rounding=rounding): @@ -123,7 +123,7 @@ class Commission(models.Model): else: employee = employee_obj.search([('user_id', '=', move.invoice_user_id.id)], limit=1) contract = employee.contract_id - if all((employee, contract)): + if all((employee, contract, contract.commission_rate)): move.commission_ids += commission_obj.create({ 'employee_id': employee.id, 'contract_id': contract.id, @@ -136,7 +136,7 @@ class Commission(models.Model): # Admin/Coach commission. employee = employee.coach_id contract = employee.contract_id - if all((employee, contract)): + if all((employee, contract, contract.admin_commission_rate)): move.commission_ids += commission_obj.create({ 'employee_id': employee.id, 'contract_id': contract.id, diff --git a/hr_commission/views/commission_views.xml b/hr_commission/views/commission_views.xml index abfb7e67..e5864b9e 100644 --- a/hr_commission/views/commission_views.xml +++ b/hr_commission/views/commission_views.xml @@ -54,7 +54,7 @@ - + @@ -118,16 +118,16 @@ @@ -210,8 +210,8 @@ action = records.action_mark_paid() @@ -240,4 +240,17 @@ action = records.action_mark_paid() + + Commission Structures + hr.commission.structure + tree,form + + + + From 9a79def4bf0b91eabf3a26fd47c2c26c358e551a Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Tue, 1 Feb 2022 14:03:44 -0800 Subject: [PATCH 2/2] [FIX] hr_commission: filter to sales invoices Additionally, don't require salesperson (e.g. commission structure or timesheets) --- hr_commission/models/commission.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hr_commission/models/commission.py b/hr_commission/models/commission.py index 59219090..4a0d9580 100644 --- a/hr_commission/models/commission.py +++ b/hr_commission/models/commission.py @@ -99,7 +99,7 @@ class Commission(models.Model): return super(Commission, self).unlink() def _filter_source_moves_for_creation(self, moves): - return moves.filtered(lambda i: i.invoice_user_id and not i.commission_ids) + return moves.filtered(lambda i: i.is_sale_document() and not i.commission_ids) def _commissions_to_confirm(self, moves): commissions = moves.mapped('commission_ids') @@ -120,7 +120,7 @@ class Commission(models.Model): if commission_structure: commission_structure.create_for_source_move(move, move_amount) - else: + elif move.invoice_user_id: employee = employee_obj.search([('user_id', '=', move.invoice_user_id.id)], limit=1) contract = employee.contract_id if all((employee, contract, contract.commission_rate)):