diff --git a/addons/delivery/models/sale_order.py b/addons/delivery/models/sale_order.py index 53723782bad..856d9e3c116 100644 --- a/addons/delivery/models/sale_order.py +++ b/addons/delivery/models/sale_order.py @@ -59,6 +59,10 @@ class SaleOrder(models.Model): self._remove_delivery_line() for order in self: order.carrier_id = carrier.id + if order.state in ('sale', 'done'): + pending_deliveries = order.picking_ids.filtered( + lambda p: p.state not in ('done', 'cancel') and not any(m.origin_returned_move_id for m in p.move_ids)) + pending_deliveries.carrier_id = carrier.id order._create_delivery_line(carrier, amount) return True diff --git a/addons/stock_delivery/tests/test_delivery_stock_move.py b/addons/stock_delivery/tests/test_delivery_stock_move.py index 61843172be5..d1473e31f2f 100644 --- a/addons/stock_delivery/tests/test_delivery_stock_move.py +++ b/addons/stock_delivery/tests/test_delivery_stock_move.py @@ -181,3 +181,57 @@ class StockMoveInvoice(AccountTestInvoicingCommon): choose_delivery_carrier.button_confirm() self.assertEqual(so.invoice_status, 'no', 'The status should still be "Nothing To Invoice"') + + def test_delivery_carrier_from_confirmed_so(self): + """Test if adding shipping method in sale order after confirmation + will add it in pickings too""" + + sale_order = self.SaleOrder.create({ + "partner_id": self.partner_18.id, + "partner_invoice_id": self.partner_18.id, + "partner_shipping_id": self.partner_18.id, + "order_line": [(0, 0, { + "name": "Cable Management Box", + "product_id": self.product_cable_management_box.id, + "product_uom_qty": 2, + "product_uom": self.product_uom_unit.id, + "price_unit": 750.00, + })], + }) + + sale_order.action_confirm() + sale_order.picking_ids.move_ids.quantity_done = 2 + sale_order.picking_ids.button_validate() + + # Return picking + return_form = Form(self.env["stock.return.picking"].with_context(active_id=sale_order.picking_ids.id, active_model="stock.picking")) + return_wizard = return_form.save() + action = return_wizard.create_returns() + return_picking = self.env["stock.picking"].browse(action["res_id"]) + + # add new product so new picking is created + sale_order.write({ + "order_line": [(0, 0, { + "name": "Another product to deliver", + "product_id": self.product_11.id, + "product_uom_qty": 2, + "product_uom": self.product_uom_unit.id, + "price_unit": 750.00, + })], + }) + + # Add delivery cost in Sales order + delivery_wizard = Form(self.env["choose.delivery.carrier"].with_context({ + "default_order_id": sale_order.id, + "default_carrier_id": self.normal_delivery.id, + })) + choose_delivery_carrier = delivery_wizard.save() + choose_delivery_carrier.button_confirm() + + # Check the carrier in picking after confirm sale order + delivery_for_product_11 = sale_order.picking_ids.filtered(lambda p: self.product_11 in p.move_ids.product_id) + self.assertEqual(delivery_for_product_11.carrier_id, self.normal_delivery, "The shipping method should be set in pending deliveries.") + + done_delivery = sale_order.picking_ids.filtered(lambda p: p.state == "done") + self.assertFalse(done_delivery.carrier_id.id, "The shipping method should not be set in done deliveries.") + self.assertFalse(return_picking.carrier_id.id, "The shipping method should not set in return pickings")