diff --git a/addons/delivery/models/sale_order.py b/addons/delivery/models/sale_order.py index af54241038d21ae71d059d5006d64647ae8e99f9..b486e5fc82a64e77f437b9de50be3a4045ae068b 100644 --- a/addons/delivery/models/sale_order.py +++ b/addons/delivery/models/sale_order.py @@ -61,6 +61,10 @@ class SaleOrder(models.Model): 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_lines)) + pending_deliveries.carrier_id = carrier.id order._create_delivery_line(carrier, amount) return True diff --git a/addons/delivery/tests/test_delivery_stock_move.py b/addons/delivery/tests/test_delivery_stock_move.py index f9c7e2929c85bfbde76e2729871814f4d26c334e..b97f845fbda6730c806994e21e852101b7cb3c54 100644 --- a/addons/delivery/tests/test_delivery_stock_move.py +++ b/addons/delivery/tests/test_delivery_stock_move.py @@ -185,3 +185,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_lines.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_lines.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")