[FIX] repair: validate a repair with a product on package

Steps to reproduce the bug:
- Create a product “P1” tracked by SN
- Update the quantity with “SN1” and a package “Pack 1”
- Create a repair order to repair the product P1:
    - Select the “SN1”

- Try to confirm the repair

Problem:
A wizard with the following message is triggered:
Insufficient Quantity to repair “The product is not available in
sufficient quantity in WH/Stock

Because when the function “action_validate” is called, we check if
there is quant with the same SN but with strict=True so, the package
should be false to find the quant:

https://github.com/odoo/odoo/blob/61c9921596662a2cbc15a154a91dd2f52c9854fd/addons/mrp_repair/models/mrp_repair.py#L210-L211

https://github.com/odoo/odoo/blob/b3180c841101510081ee8ef9c52d205497efdd4f/addons/stock/models/stock_quant.py#L102

Opw-3648874

closes odoo/odoo#151234

X-original-commit: a470f7ed958f13a31e870e0abaf19736559f3398
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Djamel Touati (otd) <otd@odoo.com>
This commit is contained in:
Djamel Touati
2024-01-26 10:35:07 +00:00
parent eb340635b2
commit 5d64f5845b
2 changed files with 56 additions and 2 deletions
+12 -2
View File
@@ -483,8 +483,18 @@ class Repair(models.Model):
if not self.product_id or self.product_id.type == 'consu':
return self._action_repair_confirm()
precision = self.env['decimal.precision'].precision_get('Product Unit of Measure')
available_qty_owner = self.env['stock.quant']._get_available_quantity(self.product_id, self.location_id, self.lot_id, owner_id=self.partner_id, strict=True)
available_qty_noown = self.env['stock.quant']._get_available_quantity(self.product_id, self.location_id, self.lot_id, strict=True)
available_qty_owner = sum(self.env['stock.quant'].search([
('product_id', '=', self.product_id.id),
('location_id', '=', self.location_id.id),
('lot_id', '=', self.lot_id.id),
('owner_id', '=', self.partner_id.id),
]).mapped('quantity'))
available_qty_noown = sum(self.env['stock.quant'].search([
('product_id', '=', self.product_id.id),
('location_id', '=', self.location_id.id),
('lot_id', '=', self.lot_id.id),
('owner_id', '=', False),
]).mapped('quantity'))
repair_qty = self.product_uom._compute_quantity(self.product_qty, self.product_id.uom_id)
for available_qty in [available_qty_owner, available_qty_noown]:
if float_compare(available_qty, repair_qty, precision_digits=precision) >= 0:
+44
View File
@@ -574,3 +574,47 @@ class TestRepair(common.TransactionCase):
repair.action_repair_end()
self.assertEqual(repair.state, 'done')
self.assertEqual(len(return_picking.move_ids), 1)
def test_repair_with_product_in_package(self):
"""
Test That a repair order can be validated when the repaired product is tracked and in a package
"""
self.product_product_3.tracking = 'serial'
self.product_product_3.type = 'product'
# Create two serial numbers
sn_1 = self.env['stock.lot'].create({'name': 'sn_1', 'product_id': self.product_product_3.id})
sn_2 = self.env['stock.lot'].create({'name': 'sn_2', 'product_id': self.product_product_3.id})
# Create two packages
package_1 = self.env['stock.quant.package'].create({'name': 'Package-test-1'})
package_2 = self.env['stock.quant.package'].create({'name': 'Package-test-2'})
# update the quantity of the product in the stock
self.env['stock.quant']._update_available_quantity(self.product_product_3, self.stock_warehouse.lot_stock_id, 1, lot_id=sn_1, package_id=package_1)
self.env['stock.quant']._update_available_quantity(self.product_product_3, self.stock_warehouse.lot_stock_id, 1, lot_id=sn_2, package_id=package_2)
self.assertEqual(self.product_product_3.qty_available, 2)
# create a repair order
repair_order = self.env['repair.order'].create({
'product_id': self.product_product_3.id,
'product_uom': self.product_product_3.uom_id.id,
# 'guarantee_limit': '2019-01-01',
'location_id': self.stock_warehouse.lot_stock_id.id,
'lot_id': sn_1.id,
'picking_type_id': self.stock_warehouse.repair_type_id.id,
'move_ids': [
(0, 0, {
'product_id': self.product_product_5.id,
'product_uom_qty': 1.0,
'state': 'draft',
'repair_line_type': 'add',
})
],
})
# Validate and complete the repair order
repair_order.action_validate()
self.assertEqual(repair_order.state, 'confirmed')
repair_order.action_repair_start()
self.assertEqual(repair_order.state, 'under_repair')
repair_order.move_ids.quantity = 1
repair_order.action_repair_end()
self.assertEqual(repair_order.state, 'done')