[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
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'])
|
||||
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<field name="move_dest_exists" invisible="1"/>
|
||||
<field name="picking_id" invisible="1"/>
|
||||
<group attrs="{'invisible': [('move_dest_exists', '=', False)]}">
|
||||
<div class="oe_grey">
|
||||
<p>This picking appears to be chained with another operation. Later, if you receive the goods you are returning now, make sure to <b>reverse</b> the returned picking in order to avoid logistic rules to be applied again (which would create duplicated operations)</p>
|
||||
@@ -21,6 +22,7 @@
|
||||
<field name="product_id" options="{'no_create': True, 'no_open': True}" force_save="1"/>
|
||||
<field name="quantity"/>
|
||||
<field name="uom_id" readonly="1" groups="uom.group_uom"/>
|
||||
<field name="move_id" invisible="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user