From 1b9a66086a5e78f22f8a5d137ec69869b73f3ad3 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Thu, 17 Nov 2022 20:57:04 +0000 Subject: [PATCH] [IMP] hr_commission: rename template field, refactor account --- hr_commission/__manifest__.py | 2 +- hr_commission/models/account.py | 40 +++++++------------ hr_commission/models/product_template.py | 2 +- hr_commission/tests/__init__.py | 2 +- ...ission.py => test_is_commission_exempt.py} | 22 +++++----- hr_commission/views/product_views.xml | 6 +-- 6 files changed, 32 insertions(+), 42 deletions(-) rename hr_commission/tests/{test_no_commission.py => test_is_commission_exempt.py} (89%) diff --git a/hr_commission/__manifest__.py b/hr_commission/__manifest__.py index c467fd8c..8db1f5a6 100644 --- a/hr_commission/__manifest__.py +++ b/hr_commission/__manifest__.py @@ -8,7 +8,7 @@ 'license': 'OPL-1', 'website': 'https://hibou.io/', 'depends': [ - 'account_invoice_margin', + # 'account_invoice_margin', # optional 'account', 'hr_contract', ], diff --git a/hr_commission/models/account.py b/hr_commission/models/account.py index aab8de10..07b39f35 100644 --- a/hr_commission/models/account.py +++ b/hr_commission/models/account.py @@ -39,19 +39,18 @@ class AccountMove(models.Model): def amount_for_commission(self, commission=None): # Override to exclude ineligible products amount = 0.0 - if self.is_invoice(): - invoice_lines = self.invoice_line_ids.filtered(lambda l: not l.product_id.no_commission) - if self.company_id.commission_amount_type == 'on_invoice_margin': - margin_threshold = float(self.env['ir.config_parameter'].sudo().get_param('commission.margin.threshold', default=0.0)) - if margin_threshold: - invoice_lines = invoice_lines.filtered(lambda l: l.get_margin_percent() > margin_threshold) - sign = -1 if self.move_type in ['in_refund', 'out_refund'] else 1 - margin = sum(invoice_lines.mapped('margin')) - amount = margin * sign - else: - amount = sum(invoice_lines.mapped('balance')) - amount = abs(amount) if self.move_type == 'entry' else -amount - return amount + invoice_lines = self.invoice_line_ids.filtered(lambda l: not l.product_id.is_commission_exempt) + sign = -1 if self.move_type in ['in_refund', 'out_refund'] else 1 + if hasattr(self, 'margin') and self.company_id.commission_amount_type == 'on_invoice_margin': + margin_threshold = float(self.env['ir.config_parameter'].sudo().get_param('commission.margin.threshold', 0.0)) + if margin_threshold: + invoice_lines = invoice_lines.filtered(lambda l: l.get_margin_percent() > margin_threshold) + amount = sum(invoice_lines.mapped('margin')) + elif self.company_id.commission_amount_type == 'on_invoice_untaxed': + amount = sum(invoice_lines.mapped('price_subtotal')) + else: + amount = sum(invoice_lines.mapped('price_total')) + return amount * sign def action_cancel(self): res = super(AccountMove, self).action_cancel() @@ -64,15 +63,6 @@ class AccountMoveLine(models.Model): _inherit = 'account.move.line' def get_margin_percent(self): - for line in self: - currency = line.move_id.currency_id - price = line.purchase_price - if line.product_id and not price: - date = line.move_id.date if line.move_id.date else fields.Date.context_today(line.move_id) - from_cur = line.move_id.company_currency_id.with_context(date=date) - price = from_cur._convert(line.product_id.standard_price, currency, line.company_id, date, round=False) - total_price = price * line.quantity - if total_price == 0.0: - return -1.0 - else: - return (line.margin / total_price) * 100.0 + if not self.price_subtotal: + return 0.0 + return ((self.margin or 0.0) / self.price_subtotal) * 100.0 diff --git a/hr_commission/models/product_template.py b/hr_commission/models/product_template.py index 6278552b..77d111c8 100644 --- a/hr_commission/models/product_template.py +++ b/hr_commission/models/product_template.py @@ -4,4 +4,4 @@ from odoo import fields, models class ProductTemplate(models.Model): _inherit = 'product.template' - no_commission = fields.Boolean('Exclude from Commissions') + is_commission_exempt = fields.Boolean('Exclude from Commissions') diff --git a/hr_commission/tests/__init__.py b/hr_commission/tests/__init__.py index 2a5a8ba1..c28ae751 100755 --- a/hr_commission/tests/__init__.py +++ b/hr_commission/tests/__init__.py @@ -1,4 +1,4 @@ # Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. from . import test_commission -from . import test_no_commission +from . import test_is_commission_exempt diff --git a/hr_commission/tests/test_no_commission.py b/hr_commission/tests/test_is_commission_exempt.py similarity index 89% rename from hr_commission/tests/test_no_commission.py rename to hr_commission/tests/test_is_commission_exempt.py index 1483b402..25e958e9 100644 --- a/hr_commission/tests/test_no_commission.py +++ b/hr_commission/tests/test_is_commission_exempt.py @@ -5,7 +5,7 @@ import logging _logger = logging.getLogger(__name__) -class TestNoCommission(common.TransactionCase): +class TestIsCommissionExempt(common.TransactionCase): def setUp(self): super().setUp() @@ -49,10 +49,10 @@ class TestNoCommission(common.TransactionCase): 'invoice_policy': 'order', 'taxes_id': [], }) - self.product_no_commission = self.env['product.product'].create({ + self.product_is_commission_exempt = self.env['product.product'].create({ 'name': 'Test Product No Commission', 'invoice_policy': 'order', - 'no_commission': True, + 'is_commission_exempt': True, 'taxes_id': [], }) @@ -69,9 +69,9 @@ class TestNoCommission(common.TransactionCase): 'tax_id': False, }), (0, 0, { 'name': 'test product no commission', - 'product_id': self.product_no_commission.id, + 'product_id': self.product_is_commission_exempt.id, 'product_uom_qty': 1.0, - 'product_uom': self.product_no_commission.uom_id.id, + 'product_uom': self.product_is_commission_exempt.uom_id.id, 'price_unit': 20.0, 'tax_id': False, })] @@ -79,12 +79,12 @@ class TestNoCommission(common.TransactionCase): self.assertEqual(order.amount_total, 120.0) return order - def test_00_no_commission_total(self): + def test_00_is_commission_exempt_total(self): # TODO: test refunds # New attribute - self.assertFalse(self.product.no_commission) - self.assertTrue(self.product_no_commission.no_commission) + self.assertFalse(self.product.is_commission_exempt) + self.assertTrue(self.product_is_commission_exempt.is_commission_exempt) # Calculate commission based on invoice total self.env.user.company_id.commission_amount_type = 'on_invoice_total' @@ -105,7 +105,7 @@ class TestNoCommission(common.TransactionCase): # commmission should be 10.0 self.assertEqual(user_commission.amount, 10.0) - def test_10_no_commission_margin(self): + def test_10_is_commission_exempt_margin(self): self.env['ir.config_parameter'].set_param('commission.margin.threshold', '51.0') low_margin_product = self.env['product.product'].create({ 'name': 'Test Low Margin Product', @@ -114,7 +114,7 @@ class TestNoCommission(common.TransactionCase): }) self.env.user.company_id.commission_amount_type = 'on_invoice_margin' self.product.standard_price = 50.0 # margin is 100%, margin = $50.0 - self.product_no_commission.standard_price = 10.0 # margin is 100% + self.product_is_commission_exempt.standard_price = 10.0 # margin is 100% sale = self._createSaleOrder() sale.write({ @@ -147,7 +147,7 @@ class TestNoCommission(common.TransactionCase): def test_20_test_zero_price(self): self.env.user.company_id.commission_amount_type = 'on_invoice_margin' self.product.standard_price = 0.0 # margin_percent is NaN - self.product_no_commission.standard_price = 10.0 # margin is 100% + self.product_is_commission_exempt.standard_price = 10.0 # margin is 100% sale = self._createSaleOrder() sale.action_confirm() diff --git a/hr_commission/views/product_views.xml b/hr_commission/views/product_views.xml index 7839df65..45ed86fe 100644 --- a/hr_commission/views/product_views.xml +++ b/hr_commission/views/product_views.xml @@ -8,8 +8,8 @@ - - @@ -21,7 +21,7 @@ - + 0