details: https://code.tryton.org/tryton/commit/1df7b3f5e2ff
branch: default
user: Cédric Krier <[email protected]>
date: Mon Dec 15 17:03:51 2025 +0100
description:
Charge duties and taxes to shipper based on incoterm
Closes #14424
diffstat:
modules/stock_package_shipping_ups/CHANGELOG
| 1 +
modules/stock_package_shipping_ups/stock.py
| 29 +++++++--
modules/stock_package_shipping_ups/tests/scenario_stock_package_shipping_ups_international.rst
| 7 ++-
3 files changed, 29 insertions(+), 8 deletions(-)
diffs (85 lines):
diff -r 7ed510032686 -r 1df7b3f5e2ff
modules/stock_package_shipping_ups/CHANGELOG
--- a/modules/stock_package_shipping_ups/CHANGELOG Mon Dec 15 17:03:34
2025 +0100
+++ b/modules/stock_package_shipping_ups/CHANGELOG Mon Dec 15 17:03:51
2025 +0100
@@ -1,3 +1,4 @@
+* Charge duties and taxes to shipper based on incoterm
Version 7.8.0 - 2025-12-15
--------------------------
diff -r 7ed510032686 -r 1df7b3f5e2ff modules/stock_package_shipping_ups/stock.py
--- a/modules/stock_package_shipping_ups/stock.py Mon Dec 15 17:03:34
2025 +0100
+++ b/modules/stock_package_shipping_ups/stock.py Mon Dec 15 17:03:51
2025 +0100
@@ -263,13 +263,13 @@
def get_payment_information(self, shipment, credential):
return {
- 'ShipmentCharge': {
- # Type 01 is for Transportation Charges
- 'Type': '01',
- 'BillShipper': {
- 'AccountNumber': credential.account_number,
- },
- },
+ 'ShipmentCharge': [{
+ # Type 01 is for Transportation Charges
+ 'Type': '01',
+ 'BillShipper': {
+ 'AccountNumber': credential.account_number,
+ },
+ }],
}
def get_package(self, use_metric, package):
@@ -416,6 +416,21 @@
international_form)
return request
+ def get_payment_information(self, shipment, credential):
+ payment_information = super().get_payment_information(
+ shipment, credential)
+ if (shipment.customs_international
+ and shipment.incoterm
+ and shipment.incoterm.import_duties == 'seller'):
+ payment_information['ShipmentCharge'].append({
+ # Type 02 is for Duties and Taxes
+ 'Type': '02',
+ 'BillShipper': {
+ 'AccountNumber': credential.account_number,
+ },
+ })
+ return payment_information
+
def get_international_form(self, shipment, credential):
form_type = self.get_international_form_type(shipment, credential)
return getattr(self, f'get_international_form_{form_type}')(
diff -r 7ed510032686 -r 1df7b3f5e2ff
modules/stock_package_shipping_ups/tests/scenario_stock_package_shipping_ups_international.rst
---
a/modules/stock_package_shipping_ups/tests/scenario_stock_package_shipping_ups_international.rst
Mon Dec 15 17:03:34 2025 +0100
+++
b/modules/stock_package_shipping_ups/tests/scenario_stock_package_shipping_ups_international.rst
Mon Dec 15 17:03:51 2025 +0100
@@ -14,7 +14,7 @@
Activate modules::
>>> config = activate_modules(
- ... ['stock_package_shipping_ups', 'stock_shipment_customs'],
+ ... ['stock_package_shipping_ups', 'stock_shipment_customs',
'incoterm'],
... create_company)
>>> Agent = Model.get('customs.agent')
@@ -22,6 +22,7 @@
>>> Address = Model.get('party.address')
>>> Carrier = Model.get('carrier')
>>> Country = Model.get('country.country')
+ >>> Incoterm = Model.get('incoterm.incoterm')
>>> Location = Model.get('stock.location')
>>> Package = Model.get('stock.package')
>>> PackageType = Model.get('stock.package.type')
@@ -156,6 +157,10 @@
>>> shipment.customer = customer
>>> shipment.carrier = carrier
>>> shipment.shipping_description = "Shipping description"
+ >>> shipment.incoterm, = Incoterm.find([
+ ... ('code', '=', 'DDP'),
+ ... ('version', '=', '2000'),
+ ... ])
>>> move = shipment.outgoing_moves.new()
>>> move.product = product
>>> move.unit = unit