From 2a160329bb39edd3580bb46f98dd5a2ae9c4f9de Mon Sep 17 00:00:00 2001 From: amoyaux Date: Thu, 10 Aug 2017 16:48:44 +0200 Subject: [PATCH] [FIX] stock : no more automatic backorder When validating a stock picking there were 2 different cases: (1) If all qty are equal to 0 it will display a wizard asking if the user want to set the quantity done to the reserved quantity for all moves. If the user accept it will automatically perform the moves after setting the quantity done. (2) If the user set a quantity on a move, it will check if there is a need for a back order. If yes it will display a wizard asking if a back order is needed or not. However the check if a back order was needed or not was never perform in case 1. If the quantity reserved was lower than the initial demand a back order was automatically created. This commit add the step 2 in the procedure of step 1 (after setting the quantity done). --- addons/stock/models/stock_picking.py | 31 ++++++++++--------- addons/stock/tests/test_move.py | 4 ++- addons/stock/tests/test_stock_flow.py | 12 +++++-- .../stock/wizard/stock_immediate_transfer.py | 2 ++ 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/addons/stock/models/stock_picking.py b/addons/stock/models/stock_picking.py index 12de338bca9..536ac2a5e6d 100644 --- a/addons/stock/models/stock_picking.py +++ b/addons/stock/models/stock_picking.py @@ -617,25 +617,28 @@ class Picking(models.Model): # Check backorder should check for other barcodes if self.check_backorder(): - view = self.env.ref('stock.view_backorder_confirmation') - wiz = self.env['stock.backorder.confirmation'].create({'pick_id': self.id}) - return { - 'name': _('Create Backorder?'), - 'type': 'ir.actions.act_window', - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'stock.backorder.confirmation', - 'views': [(view.id, 'form')], - 'view_id': view.id, - 'target': 'new', - 'res_id': wiz.id, - 'context': self.env.context, - } + return self.action_generate_backorder_wizard() self.action_done() return do_new_transfer = button_validate #TODO: replace later + def action_generate_backorder_wizard(self): + view = self.env.ref('stock.view_backorder_confirmation') + wiz = self.env['stock.backorder.confirmation'].create({'pick_id': self.id}) + return { + 'name': _('Create Backorder?'), + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'stock.backorder.confirmation', + 'views': [(view.id, 'form')], + 'view_id': view.id, + 'target': 'new', + 'res_id': wiz.id, + 'context': self.env.context, + } + def check_backorder(self): self.ensure_one() quantity_todo = {} diff --git a/addons/stock/tests/test_move.py b/addons/stock/tests/test_move.py index 6c5e8c1f3a0..338208e48e3 100644 --- a/addons/stock/tests/test_move.py +++ b/addons/stock/tests/test_move.py @@ -2184,7 +2184,9 @@ class StockMove(TransactionCase): picking.action_assign() res_dict = picking.button_validate() wizard = self.env[(res_dict.get('res_model'))].browse(res_dict.get('res_id')) - wizard.process() + res_dict_for_back_order = wizard.process() + backorder_wizard = self.env[(res_dict_for_back_order.get('res_model'))].browse(res_dict_for_back_order.get('res_id')) + backorder_wizard.process() self.assertEqual(len(picking.move_lines.move_line_ids), 1) self.assertEqual(picking.move_lines.quantity_done, 5.0) diff --git a/addons/stock/tests/test_stock_flow.py b/addons/stock/tests/test_stock_flow.py index 7e44febe1e9..d6e3fa838c4 100644 --- a/addons/stock/tests/test_stock_flow.py +++ b/addons/stock/tests/test_stock_flow.py @@ -649,7 +649,9 @@ class TestStockFlow(TestStockCommon): res_dict = picking_in_B.button_validate() wizard = self.env[(res_dict.get('res_model'))].browse(res_dict.get('res_id')) - wizard.process() + res_dict_for_back_order = wizard.process() + backorder_wizard = self.env[(res_dict_for_back_order.get('res_model'))].browse(res_dict_for_back_order.get('res_id')) + backorder_wizard.process() # ----------------------------------------------------------------------- # Check incoming shipment @@ -846,7 +848,9 @@ class TestStockFlow(TestStockCommon): res_dict = picking_out.button_validate() wizard = self.env[(res_dict.get('res_model'))].browse(res_dict.get('res_id')) - wizard.process() + res_dict_for_back_order = wizard.process() + backorder_wizard = self.env[(res_dict_for_back_order.get('res_model'))].browse(res_dict_for_back_order.get('res_id')) + backorder_wizard.process() # ---------------------------------------------------------------------- # Check product stock location quantity and quantity available. @@ -927,7 +931,9 @@ class TestStockFlow(TestStockCommon): # Transfer Incoming shipment. res_dict = picking_in.button_validate() wizard = self.env[(res_dict.get('res_model'))].browse(res_dict.get('res_id')) - wizard.process() + res_dict_for_back_order = wizard.process() + backorder_wizard = self.env[(res_dict_for_back_order.get('res_model'))].browse(res_dict_for_back_order.get('res_id')) + backorder_wizard.process() # ----------------------------------------------------------------------- # Check incoming shipment after transfer. diff --git a/addons/stock/wizard/stock_immediate_transfer.py b/addons/stock/wizard/stock_immediate_transfer.py index eecb6a70b95..05d7b38ab32 100644 --- a/addons/stock/wizard/stock_immediate_transfer.py +++ b/addons/stock/wizard/stock_immediate_transfer.py @@ -34,4 +34,6 @@ class StockImmediateTransfer(models.TransientModel): move_line.qty_done = move_line.product_uom_qty else: move.quantity_done = move.product_uom_qty + if self.pick_id.check_backorder(): + return self.pick_id.action_generate_backorder_wizard() self.pick_id.do_transfer()