diff --git a/sale_commission_product_criteria/README.rst b/sale_commission_product_criteria/README.rst index d504e516a..761499b17 100644 --- a/sale_commission_product_criteria/README.rst +++ b/sale_commission_product_criteria/README.rst @@ -86,6 +86,9 @@ Contributors * `Ooops404 `__: * Ilyas +* `PyTech `_: + + * Simone Rubino Maintainers ~~~~~~~~~~~ diff --git a/sale_commission_product_criteria/models/sale_commission_line_mixin.py b/sale_commission_product_criteria/models/sale_commission_line_mixin.py index cdea718f9..0c23d0f62 100644 --- a/sale_commission_product_criteria/models/sale_commission_line_mixin.py +++ b/sale_commission_product_criteria/models/sale_commission_line_mixin.py @@ -17,38 +17,53 @@ class SaleCommissionLineMixin(models.AbstractModel): copy=True, ) - def _get_commission_items(self, commission, product): - # Method replaced + def _commission_items_from(self): + return """ commission_item AS item + LEFT JOIN product_category AS categ ON item.categ_id = categ.id + """ + + def _commission_items_where(self): + return """ (item.product_tmpl_id IS NULL OR item.product_tmpl_id = any(%(prod_tmpls)s)) + AND (item.product_id IS NULL OR item.product_id = any(%(prod_prods)s)) + AND (item.categ_id IS NULL OR item.categ_id = any(%(categs)s)) + AND (item.commission_id = %(commission)s) + AND (item.active = TRUE) + """ + + def _commission_items_order(self): + return """item.applied_on, + item.based_on, + categ.complete_name desc + """ + + def _commission_items_query(self): + return f""" + SELECT item.id + FROM {self._commission_items_from()} + WHERE {self._commission_items_where()} + ORDER BY {self._commission_items_order()} + """ + + def _commission_items_query_params(self, commission, product): categ_ids = {} categ = product.categ_id while categ: categ_ids[categ.id] = True categ = categ.parent_id categ_ids = list(categ_ids) - # Select all suitable items. Order by best match - # (priority is: all/cat/subcat/product/variant). + return { + "prod_tmpls": product.product_tmpl_id.ids, + "prod_prods": product.ids, + "categs": categ_ids, + "commission": commission._origin.id, + } + + def _get_commission_items(self, commission, product): + if not commission: + return [] self.env.cr.execute( - """ - SELECT - item.id - FROM - commission_item AS item - LEFT JOIN product_category AS categ ON item.categ_id = categ.id - WHERE - (item.product_tmpl_id IS NULL OR item.product_tmpl_id = any(%s)) - AND (item.product_id IS NULL OR item.product_id = any(%s)) - AND (item.categ_id IS NULL OR item.categ_id = any(%s)) - AND (item.commission_id = %s) - AND (item.active = TRUE) - ORDER BY - item.applied_on, item.based_on, categ.complete_name desc - """, - ( - product.product_tmpl_id.ids, - product.ids, - categ_ids, - commission._origin.id, # Added this - ), + self._commission_items_query(), + self._commission_items_query_params(commission, product), ) item_ids = [x[0] for x in self.env.cr.fetchall()] return item_ids diff --git a/sale_commission_product_criteria/readme/CONTRIBUTORS.rst b/sale_commission_product_criteria/readme/CONTRIBUTORS.rst index c29a9c72e..194fd2403 100644 --- a/sale_commission_product_criteria/readme/CONTRIBUTORS.rst +++ b/sale_commission_product_criteria/readme/CONTRIBUTORS.rst @@ -1,3 +1,6 @@ * `Ooops404 `__: * Ilyas +* `PyTech `_: + + * Simone Rubino diff --git a/sale_commission_product_criteria/static/description/index.html b/sale_commission_product_criteria/static/description/index.html index 5227f7677..b0b77d6a9 100644 --- a/sale_commission_product_criteria/static/description/index.html +++ b/sale_commission_product_criteria/static/description/index.html @@ -428,6 +428,10 @@

Contributors

  • Ilyas <irazor147@gmail.com>
  • +
  • PyTech: +
  • diff --git a/sale_commission_product_criteria/tests/test_sale_commission_product_criteria.py b/sale_commission_product_criteria/tests/test_sale_commission_product_criteria.py index aeb63b09e..7f11042a0 100644 --- a/sale_commission_product_criteria/tests/test_sale_commission_product_criteria.py +++ b/sale_commission_product_criteria/tests/test_sale_commission_product_criteria.py @@ -214,3 +214,20 @@ def test_on_create_check(self): with self.assertRaises(ValidationError): self.rules_commission_id.commission_type = "fixed" self.rules_commission_id.onchange_commission_type() + + def test_get_items_without_commission(self): + """When there is no commission, + no items should be found by `_get_commission_items`.""" + # Arrange + product = self.product_4 + sale_order = self._create_sale_order(product, self.partner) + agent_line = sale_order.order_line.agent_ids + + # Act + items_ids = agent_line._get_commission_items( + self.commission_model.browse(), + product, + ) + + # Assert + self.assertFalse(items_ids) diff --git a/sale_commission_product_criteria_domain/models/sale_commission_line_mixin.py b/sale_commission_product_criteria_domain/models/sale_commission_line_mixin.py index b91611843..299512794 100644 --- a/sale_commission_product_criteria_domain/models/sale_commission_line_mixin.py +++ b/sale_commission_product_criteria_domain/models/sale_commission_line_mixin.py @@ -7,59 +7,62 @@ class SaleCommissionLineMixin(models.AbstractModel): _inherit = "sale.commission.line.mixin" def _get_commission_items(self, commission, product): - # Method replaced - categ_ids = {} - categ = product.categ_id - while categ: - categ_ids[categ.id] = True - categ = categ.parent_id - categ_ids = list(categ_ids) - - # Module specific mod: - if self.object_id._name == "sale.order.line": - partner = self.object_id.order_id.partner_id - elif self.object_id._name == "account.move.line": - partner = self.object_id.partner_id + res = [] + if commission.commission_type != "product_restricted": + res = super()._get_commission_items(commission, product) else: - partner = False - if partner: - group_ids = ( - partner.commission_item_agent_ids.filtered( - lambda x: x.agent_id == self.agent_id + categ_ids = {} + categ = product.categ_id + while categ: + categ_ids[categ.id] = True + categ = categ.parent_id + categ_ids = list(categ_ids) + + # Module specific mod: + if self.object_id._name == "sale.order.line": + partner = self.object_id.order_id.partner_id + elif self.object_id._name == "account.move.line": + partner = self.object_id.partner_id + else: + partner = False + if partner: + group_ids = ( + partner.commission_item_agent_ids.filtered( + lambda x: x.agent_id == self.agent_id + ) + .mapped("group_ids") + .ids ) - .mapped("group_ids") - .ids - ) - else: - group_ids = [] + else: + group_ids = [] - # Select all suitable items. Order by best match - # (priority is: all/cat/subcat/product/variant). - self.env.cr.execute( - """ - SELECT - item.id - FROM - commission_item AS item - LEFT JOIN product_category AS categ ON item.categ_id = categ.id - LEFT JOIN commission_item_agent AS cia ON item.group_id = cia.id - WHERE - (item.product_tmpl_id IS NULL OR item.product_tmpl_id = any(%s)) - AND (item.product_id IS NULL OR item.product_id = any(%s)) - AND (item.categ_id IS NULL OR item.categ_id = any(%s)) - AND (item.commission_id = %s) - AND (item.active = TRUE) - AND (cia.id IS NULL OR cia.id = any(%s)) - ORDER BY - item.applied_on, item.based_on, categ.complete_name desc - """, - ( - product.product_tmpl_id.ids, - product.ids, - categ_ids, - commission._origin.id, - group_ids, - ), - ) - item_ids = [x[0] for x in self.env.cr.fetchall()] - return item_ids + # Select all suitable items. Order by best match + # (priority is: all/cat/subcat/product/variant). + self.env.cr.execute( + """ + SELECT + item.id + FROM + commission_item AS item + LEFT JOIN product_category AS categ ON item.categ_id = categ.id + LEFT JOIN commission_item_agent AS cia ON item.group_id = cia.id + WHERE + (item.product_tmpl_id IS NULL OR item.product_tmpl_id = any(%s)) + AND (item.product_id IS NULL OR item.product_id = any(%s)) + AND (item.categ_id IS NULL OR item.categ_id = any(%s)) + AND (item.commission_id = %s) + AND (item.active = TRUE) + AND (cia.id IS NULL OR cia.id = any(%s)) + ORDER BY + item.applied_on, item.based_on, categ.complete_name desc + """, + ( + product.product_tmpl_id.ids, + product.ids, + categ_ids, + commission._origin.id, + group_ids, + ), + ) + res = [x[0] for x in self.env.cr.fetchall()] + return res