[14.0][IMP] stock_move_location: packages support

This commit is contained in:
Abraham Anes
2022-07-28 12:31:59 +02:00
committed by sergio-teruel
parent ca8590bb1b
commit 419a2d374a
6 changed files with 70 additions and 15 deletions

View File

@@ -11,3 +11,4 @@
* Jacques-Etienne Baudoux <je@bcim.be>
* Iryna Vyshnevska <i.vyshnevska@mobilunity.com>
* Alexei Rivera <arivera@archeti.com>
* Abraham Anes <abraham@studio73.es>

View File

@@ -69,6 +69,17 @@ class TestsCommon(common.TransactionCase):
"company_id": cls.company.id,
}
)
cls.lot4 = cls.env["stock.lot"].create(
{
"name": "lot4",
"product_id": cls.product_package.id,
"company_id": cls.company.id,
}
)
cls.product_package = product_obj.create(
{"name": "Orange", "type": "product", "tracking": "lot"}
)
cls.package = cls.env["stock.quant.package"].create({})
def setup_product_amounts(self):
self.set_product_amount(self.product_no_lots, self.internal_loc_1, 123)
@@ -81,16 +92,27 @@ class TestsCommon(common.TransactionCase):
self.set_product_amount(
self.product_lots, self.internal_loc_1, 1.0, lot_id=self.lot3
)
def set_product_amount(self, product, location, amount, lot_id=None):
self.env["stock.quant"]._update_available_quantity(
product, location, amount, lot_id=lot_id
self.set_product_amount(
self.product_package,
self.internal_loc_1,
1.0,
lot_id=self.lot4,
package_id=self.package,
)
def check_product_amount(self, product, location, amount, lot_id=None):
def set_product_amount(
self, product, location, amount, lot_id=None, package_id=None
):
self.env["stock.quant"]._update_available_quantity(
product, location, amount, lot_id=lot_id, package_id=package_id
)
def check_product_amount(
self, product, location, amount, lot_id=None, package_id=None
):
self.assertEqual(
self.env["stock.quant"]._get_available_quantity(
product, location, lot_id=lot_id
product, location, lot_id=lot_id, package_id=package_id
),
amount,
)

View File

@@ -21,10 +21,16 @@ class TestMoveLocation(TestsCommon):
self.check_product_amount(self.product_lots, self.internal_loc_1, 0, self.lot1)
self.check_product_amount(self.product_lots, self.internal_loc_1, 0, self.lot2)
self.check_product_amount(self.product_lots, self.internal_loc_1, 0, self.lot3)
self.check_product_amount(
self.product_package, self.internal_loc_1, 0, self.lot4, self.package
)
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)
self.check_product_amount(self.product_lots, self.internal_loc_2, 1, self.lot3)
self.check_product_amount(
self.product_package, self.internal_loc_2, 1, self.lot4, self.package
)
def test_move_location_wizard_amount(self):
"""Can't move more than exists."""
@@ -54,9 +60,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), 4)
self.assertEqual(len(wizard.stock_move_location_line_ids), 5)
wizard._onchange_destination_location_id()
self.assertEqual(len(wizard.stock_move_location_line_ids), 4)
self.assertEqual(len(wizard.stock_move_location_line_ids), 5)
dest_location_line = wizard.stock_move_location_line_ids.mapped(
"destination_location_id"
)
@@ -96,7 +102,7 @@ class TestMoveLocation(TestsCommon):
wizard.action_move_location()
picking = wizard.picking_id
self.assertEqual(picking.state, "assigned")
self.assertEqual(len(picking.move_line_ids), 4)
self.assertEqual(len(picking.move_line_ids), 5)
self.assertEqual(
sorted(picking.move_line_ids.mapped("reserved_uom_qty")), [1, 1, 1, 123]
)

View File

@@ -102,6 +102,7 @@ class StockMoveLocationWizard(models.TransientModel):
"max_quantity": quant.quantity,
"origin_location_id": quant.location_id.id,
"lot_id": quant.lot_id.id,
"package_id": quant.package_id.id,
"product_uom_id": quant.product_uom_id.id,
"custom": False,
},
@@ -128,6 +129,7 @@ class StockMoveLocationWizard(models.TransientModel):
"max_quantity": qty,
"origin_location_id": quant.location_id.id,
"lot_id": quant.lot_id.id,
"package_id": quant.package_id.id,
"product_uom_id": quant.product_uom_id.id,
"custom": False,
},
@@ -229,7 +231,8 @@ class StockMoveLocationWizard(models.TransientModel):
("product_id", "=", line.product_id.id),
("location_id", "=", line.origin_location_id.id),
("lot_id", "=", line.lot_id.id),
("qty_done", ">", 0.0),
("package_id", "=", line.package_id.id),
("product_uom_qty", ">", 0.0),
]
)
moves_to_unreserve = move_lines.mapped("move_id")
@@ -255,11 +258,13 @@ class StockMoveLocationWizard(models.TransientModel):
self.picking_id = picking
return self._get_picking_action(picking.id)
def _get_picking_action(self, pickinig_id):
action = self.env.ref("stock.action_picking_tree_all").read()[0]
def _get_picking_action(self, picking_id):
action = self.env["ir.actions.act_window"]._for_xml_id(
"stock.action_picking_tree_all"
)
form_view = self.env.ref("stock.view_picking_form").id
action.update(
{"view_mode": "form", "views": [(form_view, "form")], "res_id": pickinig_id}
{"view_mode": "form", "views": [(form_view, "form")], "res_id": picking_id}
)
return action
@@ -268,11 +273,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, SUM(quantity) AS quantity,
SELECT product_id, lot_id, package_id, SUM(quantity) AS quantity,
SUM(reserved_quantity) AS reserved_quantity
FROM stock_quant
WHERE location_id = %s
GROUP BY product_id, lot_id
GROUP BY product_id, lot_id, package_id
"""
self.env.cr.execute(query, (location_id.id,))
return self.env.cr.dictfetchall()
@@ -298,6 +303,7 @@ class StockMoveLocationWizard(models.TransientModel):
"destination_location_id": location_dest_id,
# cursor returns None instead of False
"lot_id": group.get("lot_id") or False,
"package_id": group.get("package_id") or False,
"product_uom_id": product.uom_id.id,
"custom": False,
}

View File

@@ -76,6 +76,11 @@
groups="stock.group_production_lot"
options="{'no_create': True}"
/>
<field
name="package_id"
domain="[('location_id', '=', origin_location_id)]"
options="{'no_create': True}"
/>
<field name="move_quantity" />
<field name="custom" invisible="1" />
<field

View File

@@ -32,6 +32,11 @@ class StockMoveLocationWizardLine(models.TransientModel):
comodel_name="stock.lot",
domain="[('product_id','=',product_id)]",
)
package_id = fields.Many2one(
string="Package Number",
comodel_name="stock.quant.package",
domain="[('location_id', '=', origin_location_id)]",
)
move_quantity = fields.Float(
string="Quantity to move", digits="Product Unit of Measure"
)
@@ -68,6 +73,10 @@ class StockMoveLocationWizardLine(models.TransientModel):
search_args.append(("lot_id", "=", self.lot_id.id))
else:
search_args.append(("lot_id", "=", False))
if self.package_id:
search_args.append(("package_id", "=", self.package_id.id))
else:
search_args.append(("package_id", "=", False))
res = self.env["stock.quant"].read_group(search_args, ["quantity"], [])
max_quantity = res[0]["quantity"]
return max_quantity
@@ -91,6 +100,8 @@ class StockMoveLocationWizardLine(models.TransientModel):
return {
"product_id": self.product_id.id,
"lot_id": self.lot_id.id,
"package_id": self.package_id.id,
"result_package_id": self.package_id.id,
"location_id": self.origin_location_id.id,
"location_dest_id": location_dest_id,
"qty_done": qty_done,
@@ -118,6 +129,10 @@ class StockMoveLocationWizardLine(models.TransientModel):
search_args.append(("lot_id", "=", self.lot_id.id))
else:
search_args.append(("lot_id", "=", False))
if self.package_id:
search_args.append(("package_id", "=", self.package_id.id))
else:
search_args.append(("package_id", "=", False))
res = self.env["stock.quant"].read_group(search_args, ["quantity"], [])
available_qty = res[0]["quantity"]
if not available_qty: