[REF] stock, mrp, sale_mrp: inventory validation

The method 'action_done' on inventory adjustment became private and the
action launched from the view is now 'action_validate', so we adapt
those tests to use the new function.

TASK-30921
This commit is contained in:
dip-odoo
2018-06-28 10:44:38 +02:00
committed by Pierre Masereel
parent 692847255c
commit 0cb20d2035
12 changed files with 58 additions and 57 deletions
+2 -1
View File
@@ -629,7 +629,8 @@
<function model="stock.inventory" name="action_start" eval="[[ref('mrp.stock_inventory_product_laptop_charger'), ref('mrp.stock_inventory_product_laptop_keypad')]]"/>
<function model="stock.inventory" name="action_done" eval="[[ref('stock_inventory_product_laptop_charger'), ref('stock_inventory_product_laptop_keypad')]]"/>
<function model="stock.inventory" name="action_validate" eval="[[ref('stock_inventory_product_laptop_charger')]]"/>
<function model="stock.inventory" name="action_validate" eval="[[ref('stock_inventory_product_laptop_keypad')]]"/>
<!-- Run Scheduler -->
<function model="procurement.group" name="run_scheduler"/>
+3 -3
View File
@@ -57,7 +57,7 @@ class TestMrpOrder(TestMrpCommon):
'location_id': self.warehouse_1.lot_stock_id.id
})]
})
inventory.action_done()
inventory.action_validate()
test_date_planned = datetime.now() - timedelta(days=1)
test_quantity = 2.0
@@ -241,7 +241,7 @@ class TestMrpOrder(TestMrpCommon):
})]
})
inventory.action_start()
inventory.action_done()
inventory.action_validate()
# re-assign consume material
man_order.action_assign()
@@ -399,7 +399,7 @@ class TestMrpOrder(TestMrpCommon):
'location_id': source_location_id
})]
})
inventory.action_done()
inventory.action_validate()
# create a mo for this bom
mo_custom_laptop = self.env['mrp.production'].create({
+3 -2
View File
@@ -70,7 +70,8 @@ class TestWarehouse(common.TestMrpCommon):
(0, 0, {'product_id': self.product_2.id, 'product_uom_id': self.product_2.uom_id.id, 'product_qty': 12, 'prod_lot_id': lot_product_2.id, 'location_id': self.ref('stock.stock_location_14')})
]})
(stock_inv_product_4 | stock_inv_product_2).action_start()
(stock_inv_product_4 | stock_inv_product_2).action_done()
stock_inv_product_2.action_validate()
stock_inv_product_4.action_validate()
#Create Manufacturing order.
production_3 = self.env['mrp.production'].create({
@@ -97,6 +98,6 @@ class TestWarehouse(common.TestMrpCommon):
#Check scrap move is created for this production order.
#TODO: should check with scrap objects link in between
# scrap_move = production_3.move_raw_ids.filtered(lambda x: x.product_id == self.product_2 and x.scrapped)
# self.assertTrue(scrap_move, "There are no any scrap move created for production order.")
+8 -8
View File
@@ -70,7 +70,7 @@ class TestWorkOrderProcess(common.TransactionCase):
'location_id': self.source_location_id
})]
})
inventory.action_done()
inventory.action_validate()
# Create work order
production_table.button_plan()
@@ -170,7 +170,7 @@ class TestWorkOrderProcess(common.TransactionCase):
'location_id': self.source_location_id
})]
})
inventory.action_done()
inventory.action_validate()
# Create work order
production_table.button_plan()
@@ -222,7 +222,7 @@ class TestWorkOrderProcess(common.TransactionCase):
self.assertEqual(move_table_bolt.quantity_done, 4)
# Change the quantity of the production order to 1
wiz = self.env['change.production.qty'].create({'mo_id': production_table.id ,
wiz = self.env['change.production.qty'].create({'mo_id': production_table.id ,
'product_qty': 1.0})
wiz.change_prod_qty()
# ---------------------------------------------------------------
@@ -313,7 +313,7 @@ class TestWorkOrderProcess(common.TransactionCase):
})]
})
# inventory.action_start()
inventory.action_done()
inventory.action_validate()
# Check consumed move status
mo_custom_laptop.action_assign()
@@ -377,12 +377,12 @@ class TestWorkOrderProcess(common.TransactionCase):
# finsh_moves_state = any(move.state != 'done' for move in mo_custom_laptop.move_finished_ids)
# self.assertFalse(raw_moves_state, "Wrong state in consumed moves of production order.")
# self.assertFalse(finsh_moves_state, "Wrong state in consumed moves of production order.")
#
#
# # Finished move quants of production order
#
#
# finshed_quant_lot_001 = mo_custom_laptop.move_finished_ids.filtered(lambda x: x.product_id.id == custom_laptop.id and x.product_uom_qty==6).mapped('quant_ids')
# finshed_quant_lot_002 = mo_custom_laptop.move_finished_ids.filtered(lambda x: x.product_id.id == custom_laptop.id and x.product_uom_qty==4).mapped('quant_ids')
#
#
# # Check total quantity consumed of charger, keybord
# # --------------------------------------------------
# charger_quants = mo_custom_laptop.move_raw_ids.filtered(lambda x: x.product_id.id == product_charger.id and x.state == 'done').mapped('quant_ids')
@@ -487,7 +487,7 @@ class TestWorkOrderProcess(common.TransactionCase):
})]
})
# inventory.action_start()
inventory.action_done()
inventory.action_validate()
# Start Production ...
# --------------------
+2 -2
View File
@@ -253,7 +253,7 @@ class TestSaleMrpFlow(common.TransactionCase):
'product_uom_id': self.uom_kg.id,
'product_qty': 20,
'location_id': self.stock_location.id})
inventory.action_done()
inventory.action_validate()
# --------------------------------------------------
# Assign product c to manufacturing order of product D.
@@ -307,7 +307,7 @@ class TestSaleMrpFlow(common.TransactionCase):
'product_uom_id': self.uom_kg.id,
'product_qty': 27.5025,
'location_id': self.stock_location.id})
inventory.action_done()
inventory.action_validate()
# Assign product to manufacturing order of product A.
# ---------------------------------------------------
+2 -3
View File
@@ -35,7 +35,7 @@
<field name="location_id" ref="stock_location_customers"/>
<field name="usage">customer</field>
</record>
<!-- Resource: stock.inventory -->
@@ -131,7 +131,7 @@
<field name="location_id" ref="stock_location_components"/>
</record>
<function model="stock.inventory" name="action_done">
<function model="stock.inventory" name="action_validate">
<function eval="[[('state','=','draft'),('id', '=', ref('stock_inventory_0'))]]" model="stock.inventory" name="search"/>
</function>
@@ -176,4 +176,3 @@
</data>
</odoo>
+2 -2
View File
@@ -177,9 +177,9 @@ class Inventory(models.Model):
'res_id': wiz.id,
}
else:
self.action_done()
self._action_done()
def action_done(self):
def _action_done(self):
negative = next((line for line in self.mapped('line_ids') if line.product_qty < 0 and line.product_qty != line.theoretical_qty), False)
if negative:
raise UserError(_('You cannot set a negative product quantity in an inventory line:\n\t%s - qty: %s') % (negative.product_id.name, negative.product_qty))
+7 -7
View File
@@ -44,7 +44,7 @@ class TestInventory(TransactionCase):
self.assertEqual(len(inventory.line_ids), 1)
self.assertEqual(inventory.line_ids.theoretical_qty, 100)
inventory.line_ids.product_qty = 0 # Put the quantity back to 0
inventory.action_done()
inventory.action_validate()
# check
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
@@ -72,7 +72,7 @@ class TestInventory(TransactionCase):
inventory.line_ids.prod_lot_id = lot1
inventory.line_ids.product_qty = 1
inventory.action_done()
inventory.action_validate()
# check
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product2, self.stock_location, lot_id=lot1), 1.0)
@@ -103,7 +103,7 @@ class TestInventory(TransactionCase):
inventory.line_ids.product_qty = 2
with self.assertRaises(ValidationError):
inventory.action_done()
inventory.action_validate()
def test_inventory_4(self):
""" Check that even if a product is tracked by serial number, it's possible to add
@@ -164,7 +164,7 @@ class TestInventory(TransactionCase):
self.assertEqual(inventory.line_ids.theoretical_qty, 0)
inventory.line_ids.partner_id = owner1
inventory.line_ids.product_qty = 5
inventory.action_done()
inventory.action_validate()
quant = self.env['stock.quant']._gather(self.product1, self.stock_location)
self.assertEqual(len(quant), 1)
@@ -186,7 +186,7 @@ class TestInventory(TransactionCase):
})
inventory.action_start()
inventory.line_ids.product_qty = 10
inventory.action_done()
inventory.action_validate()
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 10.0)
# Make a chain of two moves, validate the first and check that 10 products are reserved
@@ -229,7 +229,7 @@ class TestInventory(TransactionCase):
})
inventory.action_start()
inventory.line_ids.product_qty = 8
inventory.action_done()
inventory.action_validate()
self.assertEqual(self.env['stock.quant']._gather(self.product1, self.pack_location).quantity, 8.0)
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.pack_location), 0)
self.assertEqual(move_pack_cust.state, 'partially_available')
@@ -250,7 +250,7 @@ class TestInventory(TransactionCase):
})
inventory.action_start()
inventory.line_ids.product_qty = 10
inventory.action_done()
inventory.action_validate()
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.pack_location), 2)
+12 -12
View File
@@ -1055,7 +1055,7 @@ class TestSinglePicking(TestStockCommon):
})
inventory.action_start()
inventory.line_ids.product_qty = 2
inventory.action_done()
inventory.action_validate()
delivery_order.action_assign()
self.assertEqual(delivery_order.state, 'assigned')
self.assertEqual(move1.state, 'assigned')
@@ -1113,7 +1113,7 @@ class TestSinglePicking(TestStockCommon):
inventory.action_start()
inventory.line_ids.prod_lot_id = lot1
inventory.line_ids.product_qty = 2
inventory.action_done()
inventory.action_validate()
delivery_order.action_assign()
self.assertEqual(delivery_order.state, 'assigned')
self.assertEqual(move1.state, 'assigned')
@@ -1179,7 +1179,7 @@ class TestSinglePicking(TestStockCommon):
'product_id': self.productA.id,
'product_qty': 1,
})
inventory.action_done()
inventory.action_validate()
delivery_order.action_assign()
self.assertEqual(delivery_order.state, 'assigned')
self.assertEqual(move1.state, 'assigned')
@@ -1246,7 +1246,7 @@ class TestSinglePicking(TestStockCommon):
'product_id': self.productA.id,
'product_qty': 1,
})
inventory.action_done()
inventory.action_validate()
delivery_order.action_assign()
self.assertEqual(delivery_order.state, 'assigned')
self.assertEqual(move1.state, 'assigned')
@@ -1820,7 +1820,7 @@ class TestRoutes(TestStockCommon):
'categ_id': self.env.ref('product.product_category_all').id,
})
self.uom_unit = self.env.ref('uom.product_uom_unit')
def _enable_pick_ship(self):
self.wh = self.env['stock.warehouse'].search([('company_id', '=', self.env.user.id)], limit=1)
@@ -1834,7 +1834,7 @@ class TestRoutes(TestStockCommon):
`origin` fields are erased.
"""
self._enable_pick_ship()
# create a procurement group and set in on the pick procurement rule
procurement_group0 = self.env['procurement.group'].create({})
pick_rule = self.pick_ship_route.pull_ids.filtered(lambda rule: 'Stock -> Output' in rule.name)
@@ -1888,9 +1888,9 @@ class TestRoutes(TestStockCommon):
move2._action_confirm()
self.assertEqual(picking_pick.partner_id.id, False)
self.assertEqual(picking_pick.origin, False)
def test_replenish_pick_ship_1(self):
""" Creates 2 warehouses and make a replenish using one warehouse
""" Creates 2 warehouses and make a replenish using one warehouse
to ressuply the other one, Then check if the quantity and the product are matching
"""
self.product_uom_qty = 42
@@ -1916,21 +1916,21 @@ class TestRoutes(TestStockCommon):
'quantity': self.product_uom_qty,
'warehouse_id': self.wh.id,
})
replenish_wizard.launch_replenishment()
last_picking_id = self.env['stock.picking'].search([('origin', '=', 'Manual Replenishment')])[-1]
self.assertTrue(last_picking_id, 'Picking not found')
move_line = last_picking_id.move_lines.search([('product_id','=', self.product1.id)])
self.assertTrue(move_line,'The product is not in the picking')
self.assertEqual(move_line[0].product_uom_qty, self.product_uom_qty, 'Quantities does not match')
self.assertEqual(move_line[1].product_uom_qty, self.product_uom_qty, 'Quantities does not match')
self.assertEqual(move_line[1].product_uom_qty, self.product_uom_qty, 'Quantities does not match')
def test_push_rule_on_move_1(self):
""" Create a route with a push rule, force it on a move, check that it is applied.
"""
"""
self._enable_pick_ship()
stock_location = self.env.ref('stock.stock_location_stock')
push_location = self.env['stock.location'].create({
'location_id': stock_location.location_id.id,
'name': 'push location',
+13 -13
View File
@@ -1076,7 +1076,7 @@ class TestStockFlow(TestStockCommon):
'product_uom_id': self.uom_dozen.id,
'product_qty': 10,
'location_id': self.stock_location})
inventory.action_done()
inventory.action_validate()
# Check quantity available of product UnitA.
quants = self.StockQuantObj.search([('product_id', '=', self.UnitA.id), ('location_id', '=', self.stock_location)])
total_qty = [quant.quantity for quant in quants]
@@ -1092,7 +1092,7 @@ class TestStockFlow(TestStockCommon):
self.assertEqual(inventory_line.product_qty, 120, "Wrong product quantity in inventory line.")
# Modify the inventory line and set the quantity to 144 product on this new inventory.
inventory_line.write({'product_qty': 144})
inventory.action_done()
inventory.action_validate()
move = self.MoveObj.search([('product_id', '=', self.UnitA.id), ('inventory_id', '=', inventory.id)], limit=1)
self.assertEqual(move.product_uom_qty, 24, "Wrong move quantity of product UnitA.")
# Check quantity available of product UnitA.
@@ -1118,7 +1118,7 @@ class TestStockFlow(TestStockCommon):
'product_uom_id': self.uom_tone.id,
'product_qty': 5,
'location_id': self.stock_location})
inventory.action_done()
inventory.action_validate()
quants = self.StockQuantObj.search([('product_id', '=', productKG.id), ('location_id', '=', self.stock_location)])
total_qty = [quant.quantity for quant in quants]
self.assertEqual(sum(total_qty), 5000, 'Expecting 5000 kg , got %.4f kg on location stock!' % (sum(total_qty)))
@@ -1133,7 +1133,7 @@ class TestStockFlow(TestStockCommon):
self.assertEqual(inventory_line.product_qty, 5000, "Wrong product quantity in inventory line.")
# Modify the inventory line and set the quantity to 4000 product on this new inventory.
inventory_line.write({'product_qty': 4000})
inventory.action_done()
inventory.action_validate()
# Check inventory move quantity of product KG.
move = self.MoveObj.search([('product_id', '=', productKG.id), ('inventory_id', '=', inventory.id)], limit=1)
self.assertEqual(move.product_uom_qty, 1000, "Wrong move quantity of product KG.")
@@ -1168,7 +1168,7 @@ class TestStockFlow(TestStockCommon):
line_vals += [{'location_id': self.stock_location, 'product_id': lotproduct.id, 'product_qty': 30, 'product_uom_id': lotproduct.uom_id.id, 'prod_lot_id': lot1.id}]
line_vals += [{'location_id': self.stock_location, 'product_id': lotproduct.id, 'product_qty': 25, 'product_uom_id': lotproduct.uom_id.id, 'prod_lot_id': False}]
inventory.write({'line_ids': [(0, 0, x) for x in line_vals]})
inventory.action_done()
inventory.action_validate()
self.assertEqual(packproduct.qty_available, 30, "Wrong qty available for packproduct")
self.assertEqual(lotproduct.qty_available, 55, "Wrong qty available for lotproduct")
quants = self.StockQuantObj.search([('product_id', '=', packproduct.id), ('location_id', '=', self.stock_location), ('package_id', '=', pack1.id)])
@@ -1185,7 +1185,7 @@ class TestStockFlow(TestStockCommon):
line_vals += [{'location_id': self.stock_location, 'product_id': lotproduct.id, 'product_qty': 0, 'product_uom_id': lotproduct.uom_id.id, 'prod_lot_id': False}]
line_vals += [{'location_id': self.stock_location, 'product_id': lotproduct.id, 'product_qty': 10, 'product_uom_id': lotproduct.uom_id.id, 'prod_lot_id': lot1.id}]
inventory2.write({'line_ids': [(0, 0, x) for x in line_vals]})
inventory2.action_done()
inventory2.action_validate()
self.assertEqual(packproduct.qty_available, 40, "Wrong qty available for packproduct")
self.assertEqual(lotproduct.qty_available, 10, "Wrong qty available for lotproduct")
quants = self.StockQuantObj.search([('product_id', '=', lotproduct.id), ('location_id', '=', self.stock_location), ('lot_id', '=', lot1.id)])
@@ -1208,7 +1208,7 @@ class TestStockFlow(TestStockCommon):
# check all products have given category id
products_category = inventory3.line_ids.mapped('product_id.categ_id')
self.assertEqual(len(products_category), 1, "Inventory line should have only one category")
inventory3.action_done()
inventory3.action_validate()
# check category with exhausted in stock location
inventory4 = self.InvObj.create({
'name': 'Test Exhausted Product',
@@ -1220,7 +1220,7 @@ class TestStockFlow(TestStockCommon):
inventory4.action_start()
inventory4._get_inventory_lines_values()
inventory4_lines_count = len(inventory4.line_ids)
inventory4.action_done()
inventory4.action_validate()
# Add one product in this product category
product = self.ProductObj.create({'name': 'Product A', 'type': 'product', 'categ_id': category_id})
# Check that this exhausted product is in the product category inventory adjustment
@@ -1234,7 +1234,7 @@ class TestStockFlow(TestStockCommon):
inventory5.action_start()
inventory5._get_inventory_lines_values()
inventory5_lines_count = len(inventory5.line_ids)
inventory5.action_done()
inventory5.action_validate()
self.assertEqual(inventory5_lines_count, inventory4_lines_count + 1, "The new product is not taken into account in the inventory valuation.")
self.assertTrue(product.id in inventory5.line_ids.mapped('product_id').ids, "The new product is not take into account in the inventory valuation.")
@@ -1572,7 +1572,7 @@ class TestStockFlow(TestStockCommon):
'location_id': self.stock_location
})]
})
inventory.action_done()
inventory.action_validate()
# create a "all at once" delivery order for two products
picking_out = self.PickingObj.create({
@@ -1605,7 +1605,7 @@ class TestStockFlow(TestStockCommon):
'location_id': self.stock_location
})]
})
inventory.action_done()
inventory.action_validate()
# recheck availability of the delivery order, it should be assigned
picking_out.action_assign()
self.assertEquals(len(picking_out.move_lines), 1.0)
@@ -1664,7 +1664,7 @@ class TestStockFlow(TestStockCommon):
'location_id': self.stock_location
})]
})
inventory.action_done()
inventory.action_validate()
# create a "partial" delivery order for two products
picking_out = self.PickingObj.create({
@@ -1698,7 +1698,7 @@ class TestStockFlow(TestStockCommon):
'location_id': self.stock_location
})]
})
inventory.action_done()
inventory.action_validate()
# recheck availability of the delivery order, it should be assigned
picking_out.action_assign()
+3 -3
View File
@@ -28,7 +28,7 @@ class TestWarehouse(TestStockCommon):
# Update the line, set to 35
inventory.line_ids.write({'product_qty': 35.0})
inventory.action_done()
inventory.action_validate()
# Check related move and quants
self.assertIn(inventory.name, inventory.move_ids.name)
@@ -209,7 +209,7 @@ class TestWarehouse(TestStockCommon):
self.assertEqual(len(inventory.line_ids), 1, "Wrong inventory lines generated.")
self.assertEqual(inventory.line_ids.theoretical_qty, -1, "Theoretical quantity should be -1.")
inventory.line_ids.product_qty = 0 # Put the quantity back to 0
inventory.action_done()
inventory.action_validate()
# The inventory adjustment should have created one
self.assertEqual(len(inventory.move_ids), 1)
@@ -246,4 +246,4 @@ class TestResupply(TestStockCommon):
'product_min_qty': 10,
'product_max_qty': 100,
'product_uom': self.uom_unit.id,
})
})
@@ -91,5 +91,5 @@ class ProductChangeQuantity(models.TransientModel):
'location_id': wizard.location_id.id,
'line_ids': [(0, 0, line_data)],
})
inventory.action_done()
inventory.action_validate()
return {'type': 'ir.actions.act_window_close'}