bemade-addons/delivery_carrier_partner_account/tests/test_sale_order.py
Marc Durepos 6fa8068be5 [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.
2025-07-03 07:18:05 -04:00

85 lines
3.7 KiB
Python

from .test_carrier_account_common import TestCarrierAccountCommon
from odoo.tests import Form
from odoo import Command
class TestSalesOrder(TestCarrierAccountCommon):
def test_sales_order_creation_with_default_account(self):
self.client_partner.property_delivery_carrier_id = self.delivery_carrier_1
self.client_partner.default_carrier_account_id = self.client_account_1
self.env["sale.order"].create({"partner_id": self.client_partner.id})
def test_collect_sale_order_line_gets_proper_name(self):
order = self.env["sale.order"].create({"partner_id": self.client_partner.id})
wiz = self._get_shipping_wizard(order)
wiz.carrier_id = self.delivery_carrier_1
wiz.delivery_billing_mode = "collect"
wiz.button_confirm()
self.assertEqual(
order.order_line[0].name,
f"{self.delivery_carrier_1.name} [COLLECT] #{self.client_account_1.account_number}",
)
def test_prepaid_sale_order_line_gets_proper_name(self):
order = self.env["sale.order"].create({"partner_id": self.client_partner.id})
wiz = self._get_shipping_wizard(order)
with Form(wiz) as form:
form.carrier_id = self.delivery_carrier_2
form.delivery_billing_mode = "prepaid"
wiz.button_confirm()
self.assertEqual(
order.order_line[0].name,
f"{self.delivery_carrier_2.name} [PREPAID]",
)
def test_third_party_sale_order_line_gets_proper_name(self):
order = self.env["sale.order"].create({"partner_id": self.client_partner.id})
wiz = self._get_shipping_wizard(order)
wiz.carrier_id = self.delivery_carrier_1
wiz.delivery_billing_mode = "third party"
wiz.carrier_account_id = self.third_party_account_1
wiz.button_confirm()
self.assertEqual(order.carrier_account_id, self.third_party_account_1)
self.assertEqual(
order.order_line[0].name,
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):
wizard_action = order.action_open_delivery_wizard()
return (
self.env[wizard_action["res_model"]]
.with_context(wizard_action["context"])
.create({})
)