From 963b82c370eb9a3b607525d4c84113963c322ece Mon Sep 17 00:00:00 2001 From: kir-odoo <kir@odoo.com> Date: Fri, 24 Mar 2023 10:50:18 +0000 Subject: [PATCH] [FIX] delivery: shipping carrier is set after delivery generated Before this commit ================== when SO is confirmed and Delivery is created then add the shipping method in SO, in this case, the shipping carrier is not set in the existing undelivered delivery of that SO. After this commit ================= So in this commit, we set the shipping carrier for undelivered delivery. taskId - 2946360 closes odoo/odoo#120966 X-original-commit: 58f9139f8b8239b866d060223acbff1c533e08a2 Signed-off-by: Tiffany Chang <tic@odoo.com> --- addons/delivery/models/sale_order.py | 4 ++ .../tests/test_delivery_stock_move.py | 54 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/addons/delivery/models/sale_order.py b/addons/delivery/models/sale_order.py index af54241038d2..b486e5fc82a6 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 f9c7e2929c85..b97f845fbda6 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") -- GitLab