From 277e32d2dcf03a764f0ea49817564fb92a20b2d5 Mon Sep 17 00:00:00 2001 From: Arnold Moyaux Date: Mon, 18 Mar 2019 15:27:18 +0000 Subject: [PATCH] [IMP] stock: allow to change picking on returns The code that generate the return lines is moved inside an onchange. The purpose is to allow an inherit that will modify the picking_id of the wizard. It should trigger the new return lines without a call to default_get. task_id 1909413 --- .../tests/test_purchase_mrp_flow.py | 28 +++---- ...st_anglo_saxon_valuation_reconciliation.py | 8 +- .../purchase_stock/tests/test_fifo_returns.py | 8 +- .../tests/test_purchase_order.py | 11 +-- .../tests/test_stockvaluation.py | 7 +- addons/sale_mrp/tests/test_sale_mrp_flow.py | 16 ++-- ...st_anglo_saxon_valuation_reconciliation.py | 8 +- addons/sale_stock/tests/test_sale_stock.py | 9 ++- addons/stock/tests/test_move2.py | 69 ++++++++++-------- addons/stock/tests/test_warehouse.py | 7 +- addons/stock/wizard/stock_picking_return.py | 73 ++++++++++--------- .../wizard/stock_picking_return_views.xml | 2 + .../tests/test_stockvaluation.py | 9 ++- .../tests/test_stockvaluation.py | 9 ++- 14 files changed, 140 insertions(+), 124 deletions(-) diff --git a/addons/purchase_mrp/tests/test_purchase_mrp_flow.py b/addons/purchase_mrp/tests/test_purchase_mrp_flow.py index 617f84b73c2..ea99478a93b 100644 --- a/addons/purchase_mrp/tests/test_purchase_mrp_flow.py +++ b/addons/purchase_mrp/tests/test_purchase_mrp_flow.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo.tests import common, Form +from odoo.tests.common import Form, TransactionCase -class TestSaleMrpFlow(common.TransactionCase): +class TestSaleMrpFlow(TransactionCase): def setUp(self): super(TestSaleMrpFlow, self).setUp() @@ -355,14 +355,10 @@ class TestSaleMrpFlow(common.TransactionCase): self.assertEquals(order_line.qty_received, 7.0) # Return all components processed by backorder_3 - default_data = self.env['stock.return.picking'].with_context( - active_ids=backorder_3.ids, - active_id=backorder_3.ids[0] - ).default_get(['move_dest_exists', 'original_location_id', 'product_return_moves', 'parent_location_id', 'location_id']) - return_wiz = self.env['stock.return.picking'].with_context( - active_ids=backorder_3.ids, - active_id=backorder_3.ids[0] - ).create(default_data) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=backorder_3.ids, active_id=backorder_3.ids[0], + active_model='stock.picking')) + return_wiz = stock_return_picking_form.save() for return_move in return_wiz.product_return_moves: return_move.write({ 'quantity': expected_quantities[return_move.product_id], @@ -379,14 +375,10 @@ class TestSaleMrpFlow(common.TransactionCase): # Now quantity received should be 3 again self.assertEquals(order_line.qty_received, 3) - default_data = self.env['stock.return.picking'].with_context( - active_ids=return_pick.ids, - active_id=return_pick.ids[0] - ).default_get(['move_dest_exists', 'original_location_id', 'product_return_moves', 'parent_location_id', 'location_id']) - return_wiz = self.env['stock.return.picking'].with_context( - active_ids=return_pick.ids, - active_id=return_pick.ids[0] - ).create(default_data) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=return_pick.ids, active_id=return_pick.ids[0], + active_model='stock.picking')) + return_wiz = stock_return_picking_form.save() for move in return_wiz.product_return_moves: move.quantity = expected_quantities[move.product_id] res = return_wiz.create_returns() diff --git a/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py b/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py index 5b466f75078..93192940cd5 100644 --- a/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py +++ b/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py @@ -6,7 +6,7 @@ from datetime import datetime import time from odoo.addons.stock_account.tests.test_anglo_saxon_valuation_reconciliation_common import ValuationReconciliationTestCase -from odoo.tests import tagged +from odoo.tests.common import Form, tagged @tagged('post_install', '-at_install') @@ -113,8 +113,10 @@ class TestValuationReconciliation(ValuationReconciliationTestCase): }) # Return the goods and refund the invoice - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=[picking.id], active_id=picking.id).create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking.ids, active_id=picking.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() stock_return_picking.product_return_moves.quantity = 1.0 stock_return_picking_action = stock_return_picking.create_returns() return_pick = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) diff --git a/addons/purchase_stock/tests/test_fifo_returns.py b/addons/purchase_stock/tests/test_fifo_returns.py index 9a2811ac45b..8bc12d28733 100644 --- a/addons/purchase_stock/tests/test_fifo_returns.py +++ b/addons/purchase_stock/tests/test_fifo_returns.py @@ -3,7 +3,7 @@ import time from .common import TestPurchase - +from odoo.tests.common import Form class TestFifoReturns(TestPurchase): @@ -72,8 +72,10 @@ class TestFifoReturns(TestPurchase): # Return the goods of purchase order 2 picking = purchase_order_2.picking_ids[0] - return_pick_wiz = self.env['stock.return.picking'].with_context( - active_model='stock.picking', active_id=picking.id).create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking.ids, active_id=picking.ids[0], + active_model='stock.picking')) + return_pick_wiz = stock_return_picking_form.save() return_picking_id, dummy = return_pick_wiz.with_context(active_id=picking.id)._create_returns() # Important to pass through confirmation and assignation diff --git a/addons/purchase_stock/tests/test_purchase_order.py b/addons/purchase_stock/tests/test_purchase_order.py index 60f91a9c196..1367604d118 100644 --- a/addons/purchase_stock/tests/test_purchase_order.py +++ b/addons/purchase_stock/tests/test_purchase_order.py @@ -5,7 +5,7 @@ from datetime import datetime from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT from odoo.addons.account.tests.account_test_classes import AccountingTestCase -from odoo.tests import tagged +from odoo.tests import Form, tagged @tagged('post_install', '-at_install') @@ -129,11 +129,12 @@ class TestPurchaseOrder(AccountingTestCase): self.assertEqual(received_qty, 10.0, 'Purchase: Received quantity should be 10.0 instead of %s after validating incoming shipment' % received_qty) # Create return picking - StockReturnPicking = self.env['stock.return.picking'] pick = self.po.picking_ids - default_data = StockReturnPicking.with_context(active_ids=pick.ids, active_id=pick.ids[0]).default_get(['move_dest_exists', 'original_location_id', 'product_return_moves', 'parent_location_id', 'location_id']) - return_wiz = StockReturnPicking.with_context(active_ids=pick.ids, active_id=pick.ids[0]).create(default_data) - return_wiz.product_return_moves.write({'quantity': 2.0, 'to_refund': True}) # Return only 2 + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=pick.ids, active_id=pick.ids[0], + active_model='stock.picking')) + return_wiz = stock_return_picking_form.save() + return_wiz.product_return_moves.write({'quantity': 2.0, 'to_refund': True}) # Return only 2 res = return_wiz.create_returns() return_pick = self.env['stock.picking'].browse(res['res_id']) diff --git a/addons/purchase_stock/tests/test_stockvaluation.py b/addons/purchase_stock/tests/test_stockvaluation.py index 920d6e4872a..a72c4d4b633 100644 --- a/addons/purchase_stock/tests/test_stockvaluation.py +++ b/addons/purchase_stock/tests/test_stockvaluation.py @@ -391,9 +391,10 @@ class TestStockValuationWithCOA(AccountingTestCase): self.assertEqual(self.product1.stock_value, 300) # return the second po - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=receipt_po2.ids, active_id=receipt_po2.ids[0])\ - .create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=receipt_po2.ids, active_id=receipt_po2.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() stock_return_picking.product_return_moves.quantity = 10 stock_return_picking_action = stock_return_picking.create_returns() return_pick = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) diff --git a/addons/sale_mrp/tests/test_sale_mrp_flow.py b/addons/sale_mrp/tests/test_sale_mrp_flow.py index 5f46e0b969e..d4cae275bd4 100644 --- a/addons/sale_mrp/tests/test_sale_mrp_flow.py +++ b/addons/sale_mrp/tests/test_sale_mrp_flow.py @@ -921,10 +921,10 @@ class TestSaleMrpFlow(common.TransactionCase): self.assertEquals(order_line.qty_delivered, 7.0) # Return all components processed by backorder_3 - StockReturnPicking = self.env['stock.return.picking'] - default_data = StockReturnPicking.with_context(active_ids=backorder_3.ids, active_id=backorder_3.ids[0]).default_get( - ['move_dest_exists', 'original_location_id', 'product_return_moves', 'parent_location_id', 'location_id']) - return_wiz = StockReturnPicking.with_context(active_ids=backorder_3.ids, active_id=backorder_3.ids[0]).create(default_data) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=backorder_3.ids, active_id=backorder_3.ids[0], + active_model='stock.picking')) + return_wiz = stock_return_picking_form.save() for return_move in return_wiz.product_return_moves: return_move.write({ 'quantity': expected_quantities[return_move.product_id], @@ -941,10 +941,10 @@ class TestSaleMrpFlow(common.TransactionCase): # Now quantity delivered should be 3 again self.assertEquals(order_line.qty_delivered, 3) - default_data = StockReturnPicking.with_context(active_ids=return_pick.ids, active_id=return_pick.ids[0]).default_get( - ['move_dest_exists', 'original_location_id', 'product_return_moves', 'parent_location_id', 'location_id']) - return_wiz = StockReturnPicking.with_context(active_ids=return_pick.ids, active_id=return_pick.ids[0]).create( - default_data) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=return_pick.ids, active_id=return_pick.ids[0], + active_model='stock.picking')) + return_wiz = stock_return_picking_form.save() for move in return_wiz.product_return_moves: move.quantity = expected_quantities[move.product_id] res = return_wiz.create_returns() diff --git a/addons/sale_stock/tests/test_anglo_saxon_valuation_reconciliation.py b/addons/sale_stock/tests/test_anglo_saxon_valuation_reconciliation.py index f80c4bf758c..cf444c56bb3 100644 --- a/addons/sale_stock/tests/test_anglo_saxon_valuation_reconciliation.py +++ b/addons/sale_stock/tests/test_anglo_saxon_valuation_reconciliation.py @@ -4,7 +4,7 @@ import time from odoo.addons.stock_account.tests.test_anglo_saxon_valuation_reconciliation_common import ValuationReconciliationTestCase -from odoo.tests import tagged +from odoo.tests import Form, tagged @tagged('post_install', '-at_install') @@ -139,8 +139,10 @@ class TestValuationReconciliation(ValuationReconciliationTestCase): 'rate': 10.54739702, 'name': '2018-03-01', }) - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=[picking.id], active_id=picking.id).create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking.ids, active_id=picking.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() stock_return_picking.product_return_moves.quantity = 1.0 stock_return_picking_action = stock_return_picking.create_returns() return_pick = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) diff --git a/addons/sale_stock/tests/test_sale_stock.py b/addons/sale_stock/tests/test_sale_stock.py index 7782ecdc7f1..9bea6fa8847 100644 --- a/addons/sale_stock/tests/test_sale_stock.py +++ b/addons/sale_stock/tests/test_sale_stock.py @@ -3,7 +3,7 @@ from odoo.addons.sale.tests.test_sale_common import TestSale from odoo.exceptions import UserError -from odoo.tests import tagged +from odoo.tests import Form, tagged @tagged('post_install', '-at_install') @@ -159,9 +159,10 @@ class TestSaleStock(TestSale): self.inv_1.action_invoice_open() # Create return picking - StockReturnPicking = self.env['stock.return.picking'] - default_data = StockReturnPicking.with_context(active_ids=pick.ids, active_id=pick.ids[0]).default_get(['move_dest_exists', 'original_location_id', 'product_return_moves', 'parent_location_id', 'location_id']) - return_wiz = StockReturnPicking.with_context(active_ids=pick.ids, active_id=pick.ids[0]).create(default_data) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=pick.ids, active_id=pick.ids[0], + active_model='stock.picking')) + return_wiz = stock_return_picking_form.save() return_wiz.product_return_moves.quantity = 2.0 # Return only 2 return_wiz.product_return_moves.to_refund = True # Refund these 2 res = return_wiz.create_returns() diff --git a/addons/stock/tests/test_move2.py b/addons/stock/tests/test_move2.py index dd75243ffa3..a62ff9fef98 100644 --- a/addons/stock/tests/test_move2.py +++ b/addons/stock/tests/test_move2.py @@ -3,8 +3,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 +from odoo.tests import Form class TestPickShip(TestStockCommon): @@ -174,10 +173,12 @@ class TestPickShip(TestStockCommon): self.assertEqual(picking_client.state, 'assigned') # return a part of what we've done - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=picking_pick.ids, active_id=picking_pick.ids[0])\ - .create({}) - stock_return_picking.product_return_moves.quantity = 2.0 # Return only 2 + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking_pick.ids, active_id=picking_pick.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() + stock_return_picking = stock_return_picking_form.save() + stock_return_picking.product_return_moves.quantity = 2.0 # Return only 2 stock_return_picking_action = stock_return_picking.create_returns() return_pick = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) return_pick.move_lines[0].move_line_ids[0].qty_done = 2.0 @@ -197,9 +198,10 @@ class TestPickShip(TestStockCommon): self.assertEqual(picking_client.state, 'assigned') # return more than we've done - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=picking_pick.ids, active_id=picking_pick.ids[0])\ - .create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking_pick.ids, active_id=picking_pick.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() stock_return_picking.product_return_moves.quantity = 12.0 # Return 2 extra stock_return_picking_action = stock_return_picking.create_returns() return_pick = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) @@ -440,18 +442,20 @@ class TestPickShip(TestStockCommon): output. This return should not be available and should only have picking pick as origin move. """ - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=picking_pick.ids, active_id=picking_pick.ids[0])\ - .create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking_pick.ids, active_id=picking_pick.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() stock_return_picking.product_return_moves.quantity = 10.0 stock_return_picking_action = stock_return_picking.create_returns() return_pick_picking = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) self.assertEqual(return_pick_picking.state, 'waiting') - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=picking_ship.ids, active_id=picking_ship.ids[0])\ - .create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking_ship.ids, active_id=picking_ship.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() stock_return_picking.product_return_moves.quantity = 10.0 stock_return_picking_action = stock_return_picking.create_returns() return_ship_picking = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) @@ -514,9 +518,10 @@ class TestPickShip(TestStockCommon): picking_ship.move_lines[0].move_line_ids[0].qty_done = 1.0 picking_ship.action_done() - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=picking_ship.ids, active_id=picking_ship.ids[0])\ - .create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking_ship.ids, active_id=picking_ship.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() stock_return_picking.product_return_moves.quantity = 1.0 stock_return_picking_action = stock_return_picking.create_returns() return_ship_picking = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) @@ -527,9 +532,10 @@ class TestPickShip(TestStockCommon): }) return_ship_picking.action_done() - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=picking_pack.ids, active_id=picking_pack.ids[0])\ - .create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking_pack.ids, active_id=picking_pack.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() stock_return_picking.product_return_moves.quantity = 1.0 stock_return_picking_action = stock_return_picking.create_returns() return_pack_picking = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) @@ -537,9 +543,10 @@ class TestPickShip(TestStockCommon): return_pack_picking.move_lines[0].move_line_ids[0].qty_done = 1.0 return_pack_picking.action_done() - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=picking_pick.ids, active_id=picking_pick.ids[0])\ - .create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking_pick.ids, active_id=picking_pick.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() stock_return_picking.product_return_moves.quantity = 1.0 stock_return_picking_action = stock_return_picking.create_returns() return_pick_picking = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) @@ -680,9 +687,10 @@ class TestPickShip(TestStockCommon): picking_client.action_done() # return half in the pick location - return1 = self.env['stock.return.picking']\ - .with_context(active_ids=picking_pick.ids, active_id=picking_client.ids[0])\ - .create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking_client.ids, active_id=picking_client.ids[0], + active_model='stock.picking')) + return1 = stock_return_picking_form.save() return1.product_return_moves.quantity = 5.0 return1.location_id = pick_location.id return_to_pick_picking_action = return1.create_returns() @@ -692,9 +700,10 @@ class TestPickShip(TestStockCommon): return_to_pick_picking.action_done() # return the remainig products in the return warehouse - return2 = self.env['stock.return.picking']\ - .with_context(active_ids=picking_pick.ids, active_id=picking_client.ids[0])\ - .create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking_client.ids, active_id=picking_client.ids[0], + active_model='stock.picking')) + return2 = stock_return_picking_form.save() return2.product_return_moves.quantity = 5.0 return2.location_id = return_location.id return_to_return_picking_action = return2.create_returns() diff --git a/addons/stock/tests/test_warehouse.py b/addons/stock/tests/test_warehouse.py index 9a93da5c939..7288e4eb58e 100644 --- a/addons/stock/tests/test_warehouse.py +++ b/addons/stock/tests/test_warehouse.py @@ -158,9 +158,10 @@ class TestWarehouse(TestStockCommon): quant = self.env['stock.quant'].search([('product_id', '=', productA.id), ('location_id', '=', stock_location.id)]) self.assertEqual(len(quant), 1) - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=picking_out.ids, active_id=picking_out.ids[0])\ - .create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=picking_out.ids, active_id=picking_out.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() stock_return_picking.product_return_moves.quantity = 1.0 stock_return_picking_action = stock_return_picking.create_returns() return_pick = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) diff --git a/addons/stock/wizard/stock_picking_return.py b/addons/stock/wizard/stock_picking_return.py index 0a836c93499..eba3a4c3f74 100644 --- a/addons/stock/wizard/stock_picking_return.py +++ b/addons/stock/wizard/stock_picking_return.py @@ -23,6 +23,17 @@ class ReturnPicking(models.TransientModel): _name = 'stock.return.picking' _description = 'Return Picking' + @api.model + def default_get(self, fields): + if len(self.env.context.get('active_ids', list())) > 1: + raise UserError(_("You may only return one picking at a time.")) + res = super(ReturnPicking, self).default_get(fields) + if self.env.context.get('active_id') and self.env.context.get('active_model') == 'stock.picking': + picking = self.env['stock.picking'].browse(self.env.context.get('active_id')) + if picking.exists(): + res.update({'picking_id': picking.id}) + return res + picking_id = fields.Many2one('stock.picking') product_return_moves = fields.One2many('stock.return.picking.line', 'wizard_id', 'Moves') move_dest_exists = fields.Boolean('Chained Move Exists', readonly=True) @@ -32,45 +43,35 @@ class ReturnPicking(models.TransientModel): 'stock.location', 'Return Location', domain="['|', ('id', '=', original_location_id), ('return_location', '=', True)]") - @api.model - def default_get(self, fields): - if len(self.env.context.get('active_ids', list())) > 1: - raise UserError(_("You may only return one picking at a time.")) - res = super(ReturnPicking, self).default_get(fields) - + @api.onchange('picking_id') + def _onchange_picking_id(self): move_dest_exists = False product_return_moves = [] - picking = self.env['stock.picking'].browse(self.env.context.get('active_id')) - if picking: - res.update({'picking_id': picking.id}) - if picking.state != 'done': - raise UserError(_("You may only return Done pickings.")) - for move in picking.move_lines: - if move.scrapped: - continue - if move.move_dest_ids: - move_dest_exists = True - quantity = move.product_qty - sum(move.move_dest_ids.filtered(lambda m: m.state in ['partially_available', 'assigned', 'done']).\ - mapped('move_line_ids').mapped('product_qty')) - quantity = float_round(quantity, precision_rounding=move.product_uom.rounding) - product_return_moves.append((0, 0, {'product_id': move.product_id.id, 'quantity': quantity, 'move_id': move.id, 'uom_id': move.product_id.uom_id.id})) + if self.picking_id and self.picking_id.state != 'done': + raise UserError(_("You may only return Done pickings.")) + for move in self.picking_id.move_lines: + if move.scrapped: + continue + if move.move_dest_ids: + move_dest_exists = True + quantity = move.product_qty - sum(move.move_dest_ids + .filtered(lambda m: m.state in ['partially_available', 'assigned', 'done']) + .mapped('move_line_ids').mapped('product_qty') + ) + quantity = float_round(quantity, precision_rounding=move.product_uom.rounding) + product_return_moves.append((0, 0, {'product_id': move.product_id.id, 'quantity': quantity, 'move_id': move.id, 'uom_id': move.product_id.uom_id.id})) - if not product_return_moves: - raise UserError(_("No products to return (only lines in Done state and not fully returned yet can be returned).")) - if 'product_return_moves' in fields: - res.update({'product_return_moves': product_return_moves}) - if 'move_dest_exists' in fields: - res.update({'move_dest_exists': move_dest_exists}) - if 'parent_location_id' in fields and picking.location_id.usage == 'internal': - res.update({'parent_location_id': picking.picking_type_id.warehouse_id and picking.picking_type_id.warehouse_id.view_location_id.id or picking.location_id.location_id.id}) - if 'original_location_id' in fields: - res.update({'original_location_id': picking.location_id.id}) - if 'location_id' in fields: - location_id = picking.location_id.id - if picking.picking_type_id.return_picking_type_id.default_location_dest_id.return_location: - location_id = picking.picking_type_id.return_picking_type_id.default_location_dest_id.id - res['location_id'] = location_id - return res + if self.picking_id and not product_return_moves: + raise UserError(_("No products to return (only lines in Done state and not fully returned yet can be returned).")) + if self.picking_id: + self.product_return_moves = product_return_moves + self.move_dest_exists = move_dest_exists + self.parent_location_id = self.picking_id.picking_type_id.warehouse_id and self.picking_id.picking_type_id.warehouse_id.view_location_id.id or self.picking_id.location_id.location_id.id + self.original_location_id = self.picking_id.location_id.id + location_id = self.picking_id.location_id.id + if self.picking_id.picking_type_id.return_picking_type_id.default_location_dest_id.return_location: + location_id = self.picking_id.picking_type_id.return_picking_type_id.default_location_dest_id.id + self.location_id = location_id def _prepare_move_default_values(self, return_line, new_picking): vals = { diff --git a/addons/stock/wizard/stock_picking_return_views.xml b/addons/stock/wizard/stock_picking_return_views.xml index 3bbba44a176..3c901072aa7 100644 --- a/addons/stock/wizard/stock_picking_return_views.xml +++ b/addons/stock/wizard/stock_picking_return_views.xml @@ -10,6 +10,7 @@
+

This picking appears to be chained with another operation. Later, if you receive the goods you are returning now, make sure to reverse the returned picking in order to avoid logistic rules to be applied again (which would create duplicated operations)

@@ -21,6 +22,7 @@ + diff --git a/addons/stock_account/tests/test_stockvaluation.py b/addons/stock_account/tests/test_stockvaluation.py index 775bba724b4..55d3e241ec6 100644 --- a/addons/stock_account/tests/test_stockvaluation.py +++ b/addons/stock_account/tests/test_stockvaluation.py @@ -5,7 +5,7 @@ from datetime import timedelta from odoo.exceptions import UserError from odoo.fields import Date, Datetime -from odoo.tests.common import TransactionCase +from odoo.tests.common import Form, TransactionCase class TestStockValuation(TransactionCase): @@ -1206,9 +1206,10 @@ class TestStockValuation(TransactionCase): self.assertEqual(self.product1.standard_price, 16) # return - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=[out_pick.id], active_id=out_pick.id)\ - .create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=out_pick.ids, active_id=out_pick.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() stock_return_picking.product_return_moves.quantity = 1.0 # Return only 2 stock_return_picking_action = stock_return_picking.create_returns() return_pick = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) diff --git a/addons/stock_dropshipping/tests/test_stockvaluation.py b/addons/stock_dropshipping/tests/test_stockvaluation.py index 70cf614b16c..08f81173375 100644 --- a/addons/stock_dropshipping/tests/test_stockvaluation.py +++ b/addons/stock_dropshipping/tests/test_stockvaluation.py @@ -2,7 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo.addons.account.tests.account_test_classes import AccountingTestCase -from odoo.tests import tagged +from odoo.tests import Form, tagged @tagged('post_install', '-at_install') class TestStockValuation(AccountingTestCase): @@ -278,9 +278,10 @@ class TestStockValuation(AccountingTestCase): all_amls = self._dropship_product1() # return what we've done - stock_return_picking = self.env['stock.return.picking']\ - .with_context(active_ids=self.sale_order1.picking_ids.ids, active_id=self.sale_order1.picking_ids.ids[0])\ - .create({}) + stock_return_picking_form = Form(self.env['stock.return.picking'] + .with_context(active_ids=self.sale_order1.picking_ids.ids, active_id=self.sale_order1.picking_ids.ids[0], + active_model='stock.picking')) + stock_return_picking = stock_return_picking_form.save() stock_return_picking_action = stock_return_picking.create_returns() return_pick = self.env['stock.picking'].browse(stock_return_picking_action['res_id']) return_pick.move_lines[0].move_line_ids[0].qty_done = 1.0