diff --git a/addons/sale_product_matrix/models/sale_order.py b/addons/sale_product_matrix/models/sale_order.py index 6ce55c5ddf0..8c31ee77a53 100644 --- a/addons/sale_product_matrix/models/sale_order.py +++ b/addons/sale_product_matrix/models/sale_order.py @@ -45,6 +45,7 @@ class SaleOrder(models.Model): if self.grid and self.grid_update: grid = json.loads(self.grid) product_template = self.env['product.template'].browse(grid['product_template_id']) + product_ids = set() dirty_cells = grid['changes'] Attrib = self.env['product.template.attribute.value'] default_so_line_vals = {} @@ -64,8 +65,14 @@ class SaleOrder(models.Model): old_qty = sum(order_lines.mapped('product_uom_qty')) qty = cell['qty'] diff = qty - old_qty + + if not diff: + continue + + product_ids.add(product.id) + # TODO keep qty check? cannot be 0 because we only get cell changes ... - if diff and order_lines: + if order_lines: if qty == 0: if self.state in ['draft', 'sent']: # Remove lines if qty was set to 0 in matrix @@ -95,7 +102,7 @@ class SaleOrder(models.Model): # if len(order_lines) > 1: # # Remove 1+ lines # self.order_line -= order_lines[1:] - elif diff and not order_lines: + else: if not default_so_line_vals: OrderLine = self.env['sale.order.line'] default_so_line_vals = OrderLine.default_get(OrderLine._fields.keys()) @@ -108,10 +115,14 @@ class SaleOrder(models.Model): product_uom_qty=qty, product_no_variant_attribute_value_ids=no_variant_attribute_values.ids) )) - if new_lines: + if product_ids: res = False - self.update(dict(order_line=new_lines)) - for line in self.order_line.filtered(lambda line: line.product_template_id == product_template): + if new_lines: + # Add new SO lines + self.update(dict(order_line=new_lines)) + + # Recompute prices for new/modified lines + for line in self.order_line.filtered(lambda line: line.product_id.id in product_ids): res = line.product_id_change() or res line._onchange_discount() line._onchange_product_id_set_customer_lead()