Skip to content

Commit

Permalink
[FIX] sale_product_pack: Respect the order of the lines to be added
Browse files Browse the repository at this point in the history
TT51380
  • Loading branch information
victoralmau committed Oct 29, 2024
1 parent e821fc6 commit b02b240
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 14 deletions.
26 changes: 15 additions & 11 deletions sale_product_pack/models/sale_order_line.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,18 +76,22 @@ def expand_pack_line(self, write=False):

@api.model_create_multi
def create(self, vals_list):
new_vals = []
res = self.browse()
for elem in vals_list:
product = self.env["product.product"].browse(elem.get("product_id"))
if product and product.pack_ok and product.pack_type != "non_detailed":
"""Only when strictly necessary (a product is a pack) will be created line
by line, this is necessary to maintain the correct order.
"""
product_ids = [elem.get("product_id") for elem in vals_list]
products = self.env["product.product"].browse(product_ids)
if any(p.pack_ok and p.pack_type != "non_detailed" for p in products):
res = self.browse()
for elem in vals_list:
line = super().create([elem])
line.expand_pack_line()
res |= line
else:
new_vals.append(elem)
res |= super().create(new_vals)
return res
product = line.product_id
res += line
if product and product.pack_ok and product.pack_type != "non_detailed":
line.expand_pack_line()
return res
else:
return super().create(vals_list)

def write(self, vals):
res = super().write(vals)
Expand Down
68 changes: 65 additions & 3 deletions sale_product_pack/tests/test_sale_product_pack.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# Copyright 2019 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from odoo.tests.common import TransactionCase
from odoo.addons.base.tests.common import BaseCommon


class TestSaleProductPack(TransactionCase):
class TestSaleProductPack(BaseCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
Expand Down Expand Up @@ -238,7 +238,7 @@ def test_do_not_expand(self):
pack_line_update = pack_line.with_context(update_pricelist=True)
self.assertTrue(pack_line_update.do_no_expand_pack_lines)

def test_create_several_lines(self):
def test_create_several_lines_01(self):
# Create two sale order lines with two pack products
# Check 8 lines are created
# Check lines sequences and order are respected
Expand Down Expand Up @@ -273,3 +273,65 @@ def test_create_several_lines(self):
self.assertEqual(sequence_tp, self.sale_order.order_line[5].sequence)
self.assertEqual(sequence_tp, self.sale_order.order_line[6].sequence)
self.assertEqual(sequence_tp, self.sale_order.order_line[7].sequence)

def test_create_several_lines_02(self):
# Create two sale order lines with pack product
# Check 5 lines are created
# Check lines sequences and order are respected
product_cp = self.env.ref("product_pack.product_pack_cpu_detailed_components")
product = self.env["product.product"].create({"name": "Test product"})
vals = [
{
"order_id": self.sale_order.id,
"name": product.name,
"product_id": product.id,
"product_uom_qty": 1,
},
{
"order_id": self.sale_order.id,
"name": product_cp.name,
"product_id": product_cp.id,
"product_uom_qty": 1,
},
]
self.env["sale.order.line"].create(vals)
# After create, there will be eight lines (1 + 4)
self.assertEqual(len(self.sale_order.order_line), 5)
# Check if lines are well ordered
self.assertEqual(self.sale_order.order_line[0].product_id, product)
self.assertEqual(self.sale_order.order_line[1].product_id, product_cp)
sequence_tp = self.sale_order.order_line[1].sequence
self.assertEqual(sequence_tp, self.sale_order.order_line[2].sequence)
self.assertEqual(sequence_tp, self.sale_order.order_line[3].sequence)
self.assertEqual(sequence_tp, self.sale_order.order_line[4].sequence)

def test_create_several_lines_03(self):
# Create two sale order lines with pack product
# Check 5 lines are created
# Check lines sequences and order are respected
product_cp = self.env.ref("product_pack.product_pack_cpu_detailed_components")
product = self.env["product.product"].create({"name": "Test product"})
vals = [
{
"order_id": self.sale_order.id,
"name": product_cp.name,
"product_id": product_cp.id,
"product_uom_qty": 1,
},
{
"order_id": self.sale_order.id,
"name": product.name,
"product_id": product.id,
"product_uom_qty": 1,
},
]
self.env["sale.order.line"].create(vals)
# After create, there will be eight lines (4 + 1)
self.assertEqual(len(self.sale_order.order_line), 5)
# Check if lines are well ordered
self.assertEqual(self.sale_order.order_line[0].product_id, product_cp)
sequence_tp = self.sale_order.order_line[0].sequence
self.assertEqual(sequence_tp, self.sale_order.order_line[1].sequence)
self.assertEqual(sequence_tp, self.sale_order.order_line[2].sequence)
self.assertEqual(sequence_tp, self.sale_order.order_line[3].sequence)
self.assertEqual(self.sale_order.order_line[4].product_id, product)

0 comments on commit b02b240

Please sign in to comment.