From 88bcd855aea60e45d3cfeae93e37ab44acaa785e Mon Sep 17 00:00:00 2001 From: kir-odoo 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#121363 X-original-commit: 51523c0dbf6ce9dd1a1ff35e03fa6a51267da14b Signed-off-by: Tiffany Chang --- 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 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")