diff --git a/stock_move_location/tests/test_common.py b/stock_move_location/tests/test_common.py
index 5deba076d..e476f7281 100644
--- a/stock_move_location/tests/test_common.py
+++ b/stock_move_location/tests/test_common.py
@@ -15,6 +15,7 @@ class TestsCommon(common.TransactionCase):
cls.wizard_obj = cls.env["wiz.stock.move.location"]
cls.quant_obj = cls.env["stock.quant"]
cls.company = cls.env.ref("base.main_company")
+ cls.partner = cls.env.ref("base.res_partner_category_0")
cls.internal_loc_1 = cls.location_obj.create(
{
@@ -48,6 +49,9 @@ class TestsCommon(common.TransactionCase):
cls.product_lots = product_obj.create(
{"name": "Apple", "type": "product", "tracking": "lot"}
)
+ cls.product_package = product_obj.create(
+ {"name": "Orange", "type": "product", "tracking": "lot"}
+ )
cls.lot1 = cls.env["stock.lot"].create(
{
"name": "lot1",
@@ -69,6 +73,9 @@ class TestsCommon(common.TransactionCase):
"company_id": cls.company.id,
}
)
+ cls.product_package = product_obj.create(
+ {"name": "Orange", "type": "product", "tracking": "lot"}
+ )
cls.lot4 = cls.env["stock.lot"].create(
{
"name": "lot4",
@@ -76,10 +83,16 @@ class TestsCommon(common.TransactionCase):
"company_id": cls.company.id,
}
)
- cls.product_package = product_obj.create(
- {"name": "Orange", "type": "product", "tracking": "lot"}
+ cls.lot5 = cls.env["stock.lot"].create(
+ {
+ "name": "lot5",
+ "product_id": cls.product_package.id,
+ "company_id": cls.company.id,
+ }
)
cls.package = cls.env["stock.quant.package"].create({})
+ cls.package1 = cls.env["stock.quant.package"].create({})
+ cls.package2 = cls.env["stock.quant.package"].create({})
def setup_product_amounts(self):
self.set_product_amount(self.product_no_lots, self.internal_loc_1, 123)
@@ -99,20 +112,44 @@ class TestsCommon(common.TransactionCase):
lot_id=self.lot4,
package_id=self.package,
)
+ self.set_product_amount(
+ self.product_package,
+ self.internal_loc_1,
+ 1.0,
+ lot_id=self.lot4,
+ package_id=self.package1,
+ )
+ self.set_product_amount(
+ self.product_package,
+ self.internal_loc_1,
+ 1.0,
+ lot_id=self.lot5,
+ package_id=self.package2,
+ owner_id=self.partner,
+ )
def set_product_amount(
- self, product, location, amount, lot_id=None, package_id=None
+ self, product, location, amount, lot_id=None, package_id=None, owner_id=None
):
self.env["stock.quant"]._update_available_quantity(
- product, location, amount, lot_id=lot_id, package_id=package_id
+ product,
+ location,
+ amount,
+ lot_id=lot_id,
+ package_id=package_id,
+ owner_id=owner_id,
)
def check_product_amount(
- self, product, location, amount, lot_id=None, package_id=None
+ self, product, location, amount, lot_id=None, package_id=None, owner_id=None
):
self.assertEqual(
self.env["stock.quant"]._get_available_quantity(
- product, location, lot_id=lot_id, package_id=package_id
+ product,
+ location,
+ lot_id=lot_id,
+ package_id=package_id,
+ owner_id=owner_id,
),
amount,
)
diff --git a/stock_move_location/tests/test_move_location.py b/stock_move_location/tests/test_move_location.py
index 09f850819..606a414de 100644
--- a/stock_move_location/tests/test_move_location.py
+++ b/stock_move_location/tests/test_move_location.py
@@ -24,6 +24,17 @@ class TestMoveLocation(TestsCommon):
self.check_product_amount(
self.product_package, self.internal_loc_1, 0, self.lot4, self.package
)
+ self.check_product_amount(
+ self.product_package, self.internal_loc_1, 0, self.lot4, self.package1
+ )
+ self.check_product_amount(
+ self.product_package,
+ self.internal_loc_1,
+ 0,
+ self.lot5,
+ self.package2,
+ self.partner,
+ )
self.check_product_amount(self.product_no_lots, self.internal_loc_2, 123)
self.check_product_amount(self.product_lots, self.internal_loc_2, 1, self.lot1)
self.check_product_amount(self.product_lots, self.internal_loc_2, 1, self.lot2)
@@ -31,6 +42,17 @@ class TestMoveLocation(TestsCommon):
self.check_product_amount(
self.product_package, self.internal_loc_2, 1, self.lot4, self.package
)
+ self.check_product_amount(
+ self.product_package, self.internal_loc_2, 1, self.lot4, self.package1
+ )
+ self.check_product_amount(
+ self.product_package,
+ self.internal_loc_2,
+ 1,
+ self.lot5,
+ self.package2,
+ self.partner,
+ )
def test_move_location_wizard_amount(self):
"""Can't move more than exists."""
@@ -60,9 +82,9 @@ class TestMoveLocation(TestsCommon):
"""Test lines getting cleared properly."""
wizard = self._create_wizard(self.internal_loc_1, self.internal_loc_2)
wizard.onchange_origin_location()
- self.assertEqual(len(wizard.stock_move_location_line_ids), 5)
+ self.assertEqual(len(wizard.stock_move_location_line_ids), 7)
wizard._onchange_destination_location_id()
- self.assertEqual(len(wizard.stock_move_location_line_ids), 5)
+ self.assertEqual(len(wizard.stock_move_location_line_ids), 7)
dest_location_line = wizard.stock_move_location_line_ids.mapped(
"destination_location_id"
)
@@ -102,9 +124,10 @@ class TestMoveLocation(TestsCommon):
wizard.action_move_location()
picking = wizard.picking_id
self.assertEqual(picking.state, "assigned")
- self.assertEqual(len(picking.move_line_ids), 5)
+ self.assertEqual(len(picking.move_line_ids), 7)
self.assertEqual(
- sorted(picking.move_line_ids.mapped("reserved_uom_qty")), [1, 1, 1, 123]
+ sorted(picking.move_line_ids.mapped("reserved_uom_qty")),
+ [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 123.0],
)
def test_quant_transfer(self):
diff --git a/stock_move_location/wizard/stock_move_location.py b/stock_move_location/wizard/stock_move_location.py
index fa2ea53b1..69a621c64 100644
--- a/stock_move_location/wizard/stock_move_location.py
+++ b/stock_move_location/wizard/stock_move_location.py
@@ -103,6 +103,7 @@ class StockMoveLocationWizard(models.TransientModel):
"origin_location_id": quant.location_id.id,
"lot_id": quant.lot_id.id,
"package_id": quant.package_id.id,
+ "owner_id": quant.owner_id.id,
"product_uom_id": quant.product_uom_id.id,
"custom": False,
},
@@ -130,6 +131,7 @@ class StockMoveLocationWizard(models.TransientModel):
"origin_location_id": quant.location_id.id,
"lot_id": quant.lot_id.id,
"package_id": quant.package_id.id,
+ "owner_id": quant.owner_id.id,
"product_uom_id": quant.product_uom_id.id,
"custom": False,
},
@@ -232,7 +234,8 @@ class StockMoveLocationWizard(models.TransientModel):
("location_id", "=", line.origin_location_id.id),
("lot_id", "=", line.lot_id.id),
("package_id", "=", line.package_id.id),
- ("product_uom_qty", ">", 0.0),
+ ("owner_id", "=", line.owner_id.id),
+ ("qty_done", ">", 0.0),
]
)
moves_to_unreserve = move_lines.mapped("move_id")
@@ -273,11 +276,11 @@ class StockMoveLocationWizard(models.TransientModel):
# Using sql as search_group doesn't support aggregation functions
# leading to overhead in queries to DB
query = """
- SELECT product_id, lot_id, package_id, SUM(quantity) AS quantity,
+ SELECT product_id, lot_id, package_id, owner_id, SUM(quantity) AS quantity,
SUM(reserved_quantity) AS reserved_quantity
FROM stock_quant
WHERE location_id = %s
- GROUP BY product_id, lot_id, package_id
+ GROUP BY product_id, lot_id, package_id, owner_id
"""
self.env.cr.execute(query, (location_id.id,))
return self.env.cr.dictfetchall()
@@ -304,6 +307,7 @@ class StockMoveLocationWizard(models.TransientModel):
# cursor returns None instead of False
"lot_id": group.get("lot_id") or False,
"package_id": group.get("package_id") or False,
+ "owner_id": group.get("owner_id") or False,
"product_uom_id": product.uom_id.id,
"custom": False,
}
diff --git a/stock_move_location/wizard/stock_move_location.xml b/stock_move_location/wizard/stock_move_location.xml
index 887eb587f..060504d38 100644
--- a/stock_move_location/wizard/stock_move_location.xml
+++ b/stock_move_location/wizard/stock_move_location.xml
@@ -81,6 +81,7 @@
domain="[('location_id', '=', origin_location_id)]"
options="{'no_create': True}"
/>
+