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

Reply via email to