[FIX] delivery_carrier_partner_account - failing collect SO
Fixes a bug where sale orders with a partner_shipping_id not within the same commercial entity as their partner_id could not have collect carrier accounts set after being confirmed. The issue stemmed from the fact that the sale order's recipient_id field was being set to partner_id, while the created delivery order had recipient_id set to its partner_id, which is the partner_shipping_id of the sale order. In other words, the sale order recipient was incorrectly set to the main partner instead of the shipping address. This commit adds a test that was previously failing in this scenario. It also properly sets the recipient_id on the transport selection wizard and on sale orders themselves, fixing the issue.
This commit is contained in:
parent
c08f4779d8
commit
6fa8068be5
3 changed files with 34 additions and 2 deletions
|
|
@ -10,7 +10,7 @@ class SalesOrder(models.Model):
|
||||||
|
|
||||||
recipient_id = fields.Many2one(
|
recipient_id = fields.Many2one(
|
||||||
comodel_name="res.partner",
|
comodel_name="res.partner",
|
||||||
related="partner_id",
|
related="partner_shipping_id",
|
||||||
)
|
)
|
||||||
sender_id = fields.Many2one(
|
sender_id = fields.Many2one(
|
||||||
comodel_name="res.partner",
|
comodel_name="res.partner",
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
from .test_carrier_account_common import TestCarrierAccountCommon
|
from .test_carrier_account_common import TestCarrierAccountCommon
|
||||||
from odoo.tests import Form
|
from odoo.tests import Form
|
||||||
|
from odoo import Command
|
||||||
|
|
||||||
|
|
||||||
class TestSalesOrder(TestCarrierAccountCommon):
|
class TestSalesOrder(TestCarrierAccountCommon):
|
||||||
|
|
@ -44,6 +45,37 @@ class TestSalesOrder(TestCarrierAccountCommon):
|
||||||
f"{self.delivery_carrier_1.name} [THIRD PARTY] #{self.third_party_account_1.account_number}",
|
f"{self.delivery_carrier_1.name} [THIRD PARTY] #{self.third_party_account_1.account_number}",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_sale_order_shipping_to_third_party_collect(self):
|
||||||
|
# We create an order where we are shipping to a third party and the billing mode is collect
|
||||||
|
# This should work, but was previously failing with an error that the carrier account did not belong to the recipient
|
||||||
|
order = self.env["sale.order"].create(
|
||||||
|
{
|
||||||
|
"partner_id": self.client_partner.id,
|
||||||
|
"partner_shipping_id": self.random_partner.id,
|
||||||
|
"order_line": [
|
||||||
|
Command.create(
|
||||||
|
{"product_id": self.env.ref("product.product_product_4").id}
|
||||||
|
)
|
||||||
|
],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# Confirming the order is important because the sender and recipient need to be in sync
|
||||||
|
# on the sale order and delivery order. This was the point of failure previously.
|
||||||
|
order.action_confirm()
|
||||||
|
|
||||||
|
wiz = self._get_shipping_wizard(order)
|
||||||
|
with Form(wiz) as form:
|
||||||
|
form.carrier_id = self.delivery_carrier_1
|
||||||
|
form.delivery_billing_mode = "collect"
|
||||||
|
self.assertIn(self.third_party_account_1, wiz.valid_carrier_account_ids)
|
||||||
|
wiz.button_confirm()
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
order.carrier_account_id.partner_id,
|
||||||
|
self.random_partner,
|
||||||
|
"The carrier account should belong to the recipient (sale order shipping address)",
|
||||||
|
)
|
||||||
|
|
||||||
def _get_shipping_wizard(self, order):
|
def _get_shipping_wizard(self, order):
|
||||||
wizard_action = order.action_open_delivery_wizard()
|
wizard_action = order.action_open_delivery_wizard()
|
||||||
return (
|
return (
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ class ChooseDeliveryCarrier(models.TransientModel):
|
||||||
_name = "choose.delivery.carrier"
|
_name = "choose.delivery.carrier"
|
||||||
|
|
||||||
sender_id = fields.Many2one(related="company_id.partner_id")
|
sender_id = fields.Many2one(related="company_id.partner_id")
|
||||||
recipient_id = fields.Many2one(related="partner_id")
|
recipient_id = fields.Many2one(related="order_id.partner_shipping_id")
|
||||||
|
|
||||||
def button_confirm(self):
|
def button_confirm(self):
|
||||||
vals = {}
|
vals = {}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue