Set header for sale from shopify before setting the lines

The lines may depend on the header like the shipping line which depends on the
carrier.

Closes #14706
This commit is contained in:
Cédric Krier
2026-03-25 23:25:50 +01:00
parent 5db4bb63c8
commit 75ec32b080
+19 -29
View File
@@ -441,6 +441,8 @@ class Sale(IdentifierMixin, metaclass=PoolMeta):
address.save()
sale.invoice_address = address
sale._set_header_from_shopify(shop, order)
id2line = {
l.shopify_identifier: l for l in getattr(sale, 'lines', [])
if l.shopify_identifier}
@@ -504,6 +506,9 @@ class Sale(IdentifierMixin, metaclass=PoolMeta):
cls._shopify_amount_to_pay(order))
return sale
def _set_header_from_shopify(self, shop, order):
pass
@classmethod
def _shopify_amount_to_pay(cls, order):
if order['paymentTerms']:
@@ -766,17 +771,17 @@ class Sale_ShipmentCost(metaclass=PoolMeta):
shipping_line.setdefault('title')
return fields
@classmethod
def get_from_shopify(cls, shop, order, sale=None):
pool = Pool()
Tax = pool.get('account.tax')
def _set_header_from_shopify(self, shop, order):
super()._set_header_from_shopify(shop, order)
sale = super().get_from_shopify(shop, order, sale=sale)
shipment_cost_method = None
if shipping_line := order['shippingLine']:
available_carriers = sale.on_change_with_available_carriers()
carrier = None
if (self.shipment_address
and self.shipment_address == self.warehouse.address):
shipment_cost_method = None
else:
shipment_cost_method = 'order'
carrier = None
if shipment_cost_method and (shipping_line := order['shippingLine']):
available_carriers = self.on_change_with_available_carriers()
for carrier in available_carriers:
if carrier.shopify_match(shop, shipping_line):
carrier = carrier
@@ -784,25 +789,10 @@ class Sale_ShipmentCost(metaclass=PoolMeta):
else:
if available_carriers:
carrier = available_carriers[0]
setattr_changed(sale, 'carrier', carrier)
if sale.carrier:
shipment_cost_method = 'order'
for line in sale.lines:
if getattr(line, 'shipment_cost', None) is not None:
unit_price = line.unit_price
base_price = getattr(line, 'base_price', None)
if setattr_changed(
line, 'product', sale.carrier.carrier_product):
line.on_change_product()
unit_price = round_price(Tax.reverse_compute(
unit_price, line.taxes, sale.sale_date))
setattr_changed(line, 'unit_price', unit_price)
if base_price is not None:
base_price = round_price(Tax.reverse_compute(
base_price, line.taxes, sale.sale_date))
setattr_changed(line, 'base_price', base_price)
setattr_changed(sale, 'shipment_cost_method', shipment_cost_method)
return sale
else:
shipment_cost_method = None
setattr_changed(self, 'carrier', carrier)
setattr_changed(self, 'shipment_cost_method', shipment_cost_method)
class Line(IdentifierMixin, metaclass=PoolMeta):