summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Lejeune <sle@openerp.com>2017-11-03 13:22:32 +0100
committerSimon Lejeune <sle@openerp.com>2017-11-07 08:23:16 +0100
commit4a5f07654f6d4252f73253d26979cf97bbf7f11b (patch)
tree0004ea6ac028dd89412feeedf8c6c0f20e5b0054
parent82a90bc094fe2480528eb44ec3444291e5fe01d7 (diff)
[FIX] stock: `origin` and `partner_id` when procurement group is set
We chose to erase the partner_id and ref field on a picking when its content may refer to multile records. Note that the partner_id field was already hidden in the view of internal picking.
-rw-r--r--addons/stock/models/stock_move.py10
-rw-r--r--addons/stock/tests/test_move2.py78
2 files changed, 86 insertions, 2 deletions
diff --git a/addons/stock/models/stock_move.py b/addons/stock/models/stock_move.py
index 4c8e5e81116..b51495cb3d7 100644
--- a/addons/stock/models/stock_move.py
+++ b/addons/stock/models/stock_move.py
@@ -651,7 +651,15 @@ class StockMove(models.Model):
('picking_type_id', '=', move.picking_type_id.id),
('printed', '=', False),
('state', 'in', ['draft', 'confirmed', 'waiting', 'partially_available', 'assigned'])], limit=1)
- if not picking:
+ if picking:
+ # If a picking is found, we'll append `move` to its move list and thus its
+ # `partner_id` and `ref` field will refer to multiple records. In this
+ # case, we chose to wipe them.
+ picking.write({
+ 'partner_id': False,
+ 'origin': False,
+ })
+ else:
recompute = True
picking = Picking.create(move._get_new_picking_values())
move.write({'picking_id': picking.id})
diff --git a/addons/stock/tests/test_move2.py b/addons/stock/tests/test_move2.py
index f6653593913..9b54effb83d 100644
--- a/addons/stock/tests/test_move2.py
+++ b/addons/stock/tests/test_move2.py
@@ -4,6 +4,7 @@
from odoo.addons.stock.tests.common import TestStockCommon
from odoo.exceptions import UserError
from odoo import api, registry
+from odoo.tests.common import TransactionCase
class TestPickShip(TestStockCommon):
@@ -530,6 +531,7 @@ class TestPickShip(TestStockCommon):
picking_client.action_confirm()
self.assertEqual(len(picking_client.move_lines), 2, 'Moves should not be merged')
+
class TestSinglePicking(TestStockCommon):
def test_backorder_1(self):
""" Check the good behavior of creating a backorder for an available stock move.
@@ -1464,7 +1466,6 @@ class TestSinglePicking(TestStockCommon):
class TestStockUOM(TestStockCommon):
-
def setUp(self):
with registry().cursor() as cr:
env = api.Environment(cr, 1, {})
@@ -1541,3 +1542,78 @@ class TestStockUOM(TestStockCommon):
self.assertEqual(len(back_order_in), 1.00, 'There should be one back order created')
self.assertEqual(back_order_in.move_lines.product_qty, 91640.00, 'There should be one back order created')
+
+
+class TestRoutes(TransactionCase):
+ def test_pick_ship_1(self):
+ """ Enable the pick ship route, force a procurement group on the
+ pick. When a second move is added, make sure the `partner_id` and
+ `origin` fields are erased.
+ """
+ product1 = self.env['product.product'].create({
+ 'name': 'product a',
+ 'type': 'product',
+ 'categ_id': self.env.ref('product.product_category_all').id,
+ })
+ uom_unit = self.env.ref('product.product_uom_unit')
+ wh = self.env['stock.warehouse'].search([('company_id', '=', self.env.user.id)], limit=1)
+
+ # create and get back the pick ship route
+ wh.write({'delivery_steps': 'pick_ship'})
+ pick_ship_route = wh.route_ids.filtered(lambda r: 'Pick + Ship' in r.name)
+
+ # create a procurement group and set in on the pick procurement rule
+ procurement_group0 = self.env['procurement.group'].create({})
+ pick_rule = pick_ship_route.pull_ids.filtered(lambda rule: 'Stock -> Output' in rule.name)
+ push_rule = pick_ship_route.pull_ids - pick_rule
+ pick_rule.write({
+ 'group_propagation_option': 'fixed',
+ 'group_id': procurement_group0.id,
+ })
+
+ stock_location = pick_rule.location_src_id
+ ship_location = pick_rule.location_id
+ customer_location = push_rule.location_id
+ partners = self.env['res.partner'].search([], limit=2)
+ partner0 = partners[0]
+ partner1 = partners[1]
+ procurement_group1 = self.env['procurement.group'].create({'partner_id': partner0.id})
+ procurement_group2 = self.env['procurement.group'].create({'partner_id': partner1.id})
+
+ move1 = self.env['stock.move'].create({
+ 'name': 'first out move',
+ 'procure_method': 'make_to_order',
+ 'location_id': ship_location.id,
+ 'location_dest_id': customer_location.id,
+ 'product_id': product1.id,
+ 'product_uom': uom_unit.id,
+ 'product_uom_qty': 1.0,
+ 'warehouse_id': wh.id,
+ 'group_id': procurement_group1.id,
+ 'origin': 'origin1',
+ })
+
+ move2 = self.env['stock.move'].create({
+ 'name': 'second out move',
+ 'procure_method': 'make_to_order',
+ 'location_id': ship_location.id,
+ 'location_dest_id': customer_location.id,
+ 'product_id': product1.id,
+ 'product_uom': uom_unit.id,
+ 'product_uom_qty': 1.0,
+ 'warehouse_id': wh.id,
+ 'group_id': procurement_group2.id,
+ 'origin': 'origin2',
+ })
+
+ # first out move, the "pick" picking should have a partner and an origin
+ move1._action_confirm()
+ picking_pick = move1.move_orig_ids.picking_id
+ self.assertEqual(picking_pick.partner_id.id, procurement_group1.partner_id.id)
+ self.assertEqual(picking_pick.origin, move1.group_id.name)
+
+ # second out move, the "pick" picking should have lost its partner and origin
+ move2._action_confirm()
+ self.assertEqual(picking_pick.partner_id.id, False)
+ self.assertEqual(picking_pick.origin, False)
+