[FIX] purchase_stock: relax constrains on orderpoint location

The check added in 643e093a4bc9d46973705831697036b56a89b143 was too
strict in case a purchase order was created from an orderpoint
triggering multiple rules. The orderpoint's location could be below
another warehouse that the first rule's location and thus raising the
error.

closes odoo/odoo#77079

X-original-commit: df1f90673fc06f3d535833229d8af3ef6a51dd61
Signed-off-by: Arnold Moyaux <amoyaux@users.noreply.github.com>
Signed-off-by: William Henrotin <Whenrow@users.noreply.github.com>
This commit is contained in:
William Henrotin
2021-09-23 16:05:55 +00:00
parent 60864de16b
commit 9b43d7ec5a
2 changed files with 83 additions and 1 deletions
+2 -1
View File
@@ -480,7 +480,8 @@ class PurchaseOrderLine(models.Model):
def _check_orderpoint_picking_type(self):
warehouse_loc = self.order_id.picking_type_id.warehouse_id.view_location_id
if warehouse_loc and self.orderpoint_id and not warehouse_loc.parent_path in self.orderpoint_id.location_id.parent_path:
dest_loc = self.move_dest_ids.location_id or self.orderpoint_id.location_id
if warehouse_loc and dest_loc and not warehouse_loc.parent_path in dest_loc[0].parent_path:
raise UserError(_('For the product %s, the warehouse of the operation type (%s) is inconsistent with the location (%s) of the reordering rule (%s). Change the operation type or cancel the request for quotation.',
self.product_id.display_name, self.order_id.picking_type_id.display_name, self.orderpoint_id.location_id.display_name, self.orderpoint_id.display_name))
@@ -166,6 +166,87 @@ class TestReorderingRule(TransactionCase):
self.assertEqual(purchase_order.picking_ids.move_lines[-1].product_qty, 5)
self.assertEqual(purchase_order.picking_ids.move_lines[-1].location_dest_id, warehouse_1.lot_stock_id)
def test_reordering_rule_3(self):
"""
trigger a reordering rule with a route to a location without warehouse
"""
warehouse_1 = self.env['stock.warehouse'].search([('company_id', '=', self.env.user.id)], limit=1)
outside_loc = self.env['stock.location'].create({
'name': 'outside',
'usage': 'internal',
'location_id': self.env.ref('stock.stock_location_locations').id,
})
route = self.env['stock.location.route'].create({
'name': 'resupply outside',
'rule_ids': [
(0, False, {
'name': 'Buy',
'location_id': warehouse_1.lot_stock_id.id,
'company_id': self.env.company.id,
'action': 'buy',
'sequence': 2,
'procure_method': 'make_to_stock',
'picking_type_id': self.env.ref('stock.picking_type_in').id,
}),
(0, False, {
'name': 'ressuply from stock',
'location_src_id': warehouse_1.lot_stock_id.id,
'location_id': outside_loc.id,
'company_id': self.env.company.id,
'action': 'pull',
'procure_method': 'mts_else_mto',
'sequence': 1,
'picking_type_id': self.env.ref('stock.picking_type_out').id,
}),
],
})
vendor1 = self.env['res.partner'].create({'name': 'AAA', 'email': 'from.test@example.com'})
supplier_info1 = self.env['product.supplierinfo'].create({
'name': vendor1.id,
'price': 50,
})
product = self.env['product.product'].create({
'name': 'product_rr_3',
'type': 'product',
'route_ids': [(4, route.id)],
'seller_ids': [(6, 0, [supplier_info1.id])],
})
# create reordering rules
orderpoint_form = Form(self.env['stock.warehouse.orderpoint'].with_user(2))
orderpoint_form.warehouse_id = warehouse_1
orderpoint_form.location_id = outside_loc
orderpoint_form.product_id = product
orderpoint_form.product_min_qty = 0.000
orderpoint_form.product_max_qty = 0.000
order_point_1 = orderpoint_form.save()
order_point_1.route_id = route
order_point_1.trigger = 'manual'
# Create move out of 10 product
move = self.env['stock.move'].create({
'name': 'move out',
'product_id': product.id,
'product_uom': product.uom_id.id,
'product_uom_qty': 10,
'location_id': outside_loc.id,
'location_dest_id': self.env.ref('stock.stock_location_customers').id,
'picking_type_id': self.env.ref('stock.picking_type_out').id,
})
move._action_confirm()
# Forecast on the order point should be -10
self.assertEqual(order_point_1.qty_forecast, -10)
order_point_1.action_replenish()
# Check purchase order created or not
purchase_order = self.env['purchase.order.line'].search([('product_id', '=', product.id)]).order_id
self.assertTrue(purchase_order, 'No purchase order created.')
self.assertEqual(len(purchase_order.order_line), 1, 'Not enough purchase order lines created.')
purchase_order.button_confirm()
def test_replenish_report_1(self):
"""Tests the auto generation of manual orderpoints.