details:   https://code.tryton.org/tryton/commit/4d2bb29276c1
branch:    default
user:      Cédric Krier <[email protected]>
date:      Wed Feb 25 11:37:37 2026 +0100
description:
        Rename invoice method on shipment into on fulfillment
diffstat:

 modules/account_stock_anglo_saxon/tests/scenario_account_stock_anglo_saxon.rst 
                         |   6 +-
 modules/account_stock_continental/tests/scenario_account_stock_continental.rst 
                         |   4 +-
 modules/carrier_carriage/tests/scenario_carrier_carriage.rst                   
                         |   2 +-
 
modules/carrier_percentage/tests/scenario_carrier_percentage_with_purchase_shipment_cost.rst
            |   2 +-
 modules/carrier_weight/tests/scenario_carrier_weight.rst                       
                         |   2 +-
 modules/product_kit/common.py                                                  
                         |   2 +-
 modules/product_kit/tests/scenario_product_kit_purchase.rst                    
                         |   2 +-
 modules/product_kit/tests/scenario_product_kit_sale.rst                        
                         |   2 +-
 modules/purchase/CHANGELOG                                                     
                         |   1 +
 modules/purchase/configuration.py                                              
                         |  13 +++++
 modules/purchase/purchase.py                                                   
                         |  26 ++++++---
 modules/purchase/tests/scenario_purchase.rst                                   
                         |   8 +-
 modules/purchase/tests/scenario_purchase_line_cancelled_on_shipment.rst        
                         |   2 +-
 
modules/purchase_shipment_cost/tests/scenario_purchase_shipment_cost_with_account_stock_anglo_saxon.rst
 |   2 +-
 modules/sale/CHANGELOG                                                         
                         |   1 +
 modules/sale/configuration.py                                                  
                         |  13 +++++
 modules/sale/party.py                                                          
                         |  12 ++++
 modules/sale/sale.py                                                           
                         |  23 +++++---
 modules/sale/tests/scenario_sale.rst                                           
                         |   8 +-
 modules/sale/tests/scenario_sale_default_methods.rst                           
                         |   4 +-
 modules/sale/tests/scenario_sale_line_cancelled_on_shipment.rst                
                         |   2 +-
 
modules/sale_advance_payment/tests/scenario_sale_advance_payment_on_shipment.rst
                        |   2 +-
 modules/sale_credit_limit/sale.py                                              
                         |   2 +-
 modules/sale_shipment_cost/sale.py                                             
                         |   6 +-
 modules/sale_shipment_cost/tests/scenario_sale_shipment_cost.rst               
                         |   6 +-
 
modules/sale_shipment_cost/tests/scenario_sale_shipment_cost_cancelled_on_shipment.rst
                  |   2 +-
 modules/sale_shipment_grouping/sale.py                                         
                         |   6 +-
 modules/sale_supply/sale.py                                                    
                         |   4 +-
 modules/sale_supply_drop_shipment/purchase.py                                  
                         |   4 +-
 modules/web_shop_shopify/web.py                                                
                         |   2 +-
 30 files changed, 111 insertions(+), 60 deletions(-)

diffs (694 lines):

diff -r e374c74141ca -r 4d2bb29276c1 
modules/account_stock_anglo_saxon/tests/scenario_account_stock_anglo_saxon.rst
--- 
a/modules/account_stock_anglo_saxon/tests/scenario_account_stock_anglo_saxon.rst
    Wed Feb 25 15:24:25 2026 +0100
+++ 
b/modules/account_stock_anglo_saxon/tests/scenario_account_stock_anglo_saxon.rst
    Wed Feb 25 11:37:37 2026 +0100
@@ -105,7 +105,7 @@
     >>> purchase = Purchase()
     >>> purchase.party = supplier
     >>> purchase.payment_term = payment_term
-    >>> purchase.invoice_method = 'shipment'
+    >>> purchase.invoice_method = 'fulfillment'
     >>> purchase_line = purchase.lines.new()
     >>> purchase_line.product = product
     >>> purchase_line.quantity = 5.0
@@ -189,7 +189,7 @@
     >>> sale = Sale()
     >>> sale.party = customer
     >>> sale.payment_term = payment_term
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> sale_line = sale.lines.new()
     >>> sale_line.product = product
     >>> sale_line.quantity = 2.0
@@ -324,7 +324,7 @@
     >>> purchase = Purchase()
     >>> purchase.party = supplier
     >>> purchase.payment_term = payment_term
-    >>> purchase.invoice_method = 'shipment'
+    >>> purchase.invoice_method = 'fulfillment'
     >>> purchase_line = purchase.lines.new()
     >>> purchase_line.product = product_by5
     >>> purchase_line.quantity = 1.0
diff -r e374c74141ca -r 4d2bb29276c1 
modules/account_stock_continental/tests/scenario_account_stock_continental.rst
--- 
a/modules/account_stock_continental/tests/scenario_account_stock_continental.rst
    Wed Feb 25 15:24:25 2026 +0100
+++ 
b/modules/account_stock_continental/tests/scenario_account_stock_continental.rst
    Wed Feb 25 11:37:37 2026 +0100
@@ -113,7 +113,7 @@
     >>> purchase = Purchase()
     >>> purchase.party = supplier
     >>> purchase.payment_term = payment_term
-    >>> purchase.invoice_method = 'shipment'
+    >>> purchase.invoice_method = 'fulfillment'
     >>> purchase_line = purchase.lines.new()
     >>> purchase_line.product = product
     >>> purchase_line.quantity = 5.0
@@ -185,7 +185,7 @@
     >>> sale = Sale()
     >>> sale.party = customer
     >>> sale.payment_term = payment_term
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> sale_line = sale.lines.new()
     >>> sale_line.product = product
     >>> sale_line.quantity = 2.0
diff -r e374c74141ca -r 4d2bb29276c1 
modules/carrier_carriage/tests/scenario_carrier_carriage.rst
--- a/modules/carrier_carriage/tests/scenario_carrier_carriage.rst      Wed Feb 
25 15:24:25 2026 +0100
+++ b/modules/carrier_carriage/tests/scenario_carrier_carriage.rst      Wed Feb 
25 11:37:37 2026 +0100
@@ -97,7 +97,7 @@
     >>> sale = Sale()
     >>> sale.party = customer
     >>> sale.carrier = carrier1
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> sale.shipment_cost_method = 'shipment'
     >>> before_carriage = sale.before_carriages.new(type='before')
     >>> before_carriage.carrier = carrier2
diff -r e374c74141ca -r 4d2bb29276c1 
modules/carrier_percentage/tests/scenario_carrier_percentage_with_purchase_shipment_cost.rst
--- 
a/modules/carrier_percentage/tests/scenario_carrier_percentage_with_purchase_shipment_cost.rst
      Wed Feb 25 15:24:25 2026 +0100
+++ 
b/modules/carrier_percentage/tests/scenario_carrier_percentage_with_purchase_shipment_cost.rst
      Wed Feb 25 11:37:37 2026 +0100
@@ -139,7 +139,7 @@
     >>> sale.party = customer
     >>> sale.carrier = carrier
     >>> sale.payment_term = payment_term
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> sale.shipment_cost_method = 'shipment'
     >>> sale_line = sale.lines.new()
     >>> sale_line.product = product
diff -r e374c74141ca -r 4d2bb29276c1 
modules/carrier_weight/tests/scenario_carrier_weight.rst
--- a/modules/carrier_weight/tests/scenario_carrier_weight.rst  Wed Feb 25 
15:24:25 2026 +0100
+++ b/modules/carrier_weight/tests/scenario_carrier_weight.rst  Wed Feb 25 
11:37:37 2026 +0100
@@ -150,7 +150,7 @@
     >>> sale.party = customer
     >>> sale.carrier = carrier
     >>> sale.payment_term = payment_term
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> sale.shipment_cost_method = 'shipment'
     >>> sale_line = sale.lines.new()
     >>> sale_line.product = product
diff -r e374c74141ca -r 4d2bb29276c1 modules/product_kit/common.py
--- a/modules/product_kit/common.py     Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/product_kit/common.py     Wed Feb 25 11:37:37 2026 +0100
@@ -243,7 +243,7 @@
 
         def _get_invoice_line_quantity(self):
             quantity = super()._get_invoice_line_quantity()
-            if (getattr(self, prefix).invoice_method == 'shipment'
+            if (getattr(self, prefix).invoice_method == 'fulfillment'
                     and self.components):
                 ratio = min(c.get_moved_ratio() for c in self.components)
                 quantity = self.unit.round(self.quantity * ratio)
diff -r e374c74141ca -r 4d2bb29276c1 
modules/product_kit/tests/scenario_product_kit_purchase.rst
--- a/modules/product_kit/tests/scenario_product_kit_purchase.rst       Wed Feb 
25 15:24:25 2026 +0100
+++ b/modules/product_kit/tests/scenario_product_kit_purchase.rst       Wed Feb 
25 11:37:37 2026 +0100
@@ -150,7 +150,7 @@
     >>> Purchase = Model.get('purchase.purchase')
     >>> purchase = Purchase()
     >>> purchase.party = supplier
-    >>> purchase.invoice_method = 'shipment'
+    >>> purchase.invoice_method = 'fulfillment'
     >>> line = purchase.lines.new()
     >>> line.product = composed_product
     >>> line.quantity = 1
diff -r e374c74141ca -r 4d2bb29276c1 
modules/product_kit/tests/scenario_product_kit_sale.rst
--- a/modules/product_kit/tests/scenario_product_kit_sale.rst   Wed Feb 25 
15:24:25 2026 +0100
+++ b/modules/product_kit/tests/scenario_product_kit_sale.rst   Wed Feb 25 
11:37:37 2026 +0100
@@ -137,7 +137,7 @@
     >>> Sale = Model.get('sale.sale')
     >>> sale = Sale()
     >>> sale.party = customer
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> line = sale.lines.new()
     >>> line.product = composed_product
     >>> line.quantity = 2
diff -r e374c74141ca -r 4d2bb29276c1 modules/purchase/CHANGELOG
--- a/modules/purchase/CHANGELOG        Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/purchase/CHANGELOG        Wed Feb 25 11:37:37 2026 +0100
@@ -1,3 +1,4 @@
+* Rename invoice method on shipment into on fulfillment
 * Add support for Python 3.14
 * Remove support for Python 3.9
 
diff -r e374c74141ca -r 4d2bb29276c1 modules/purchase/configuration.py
--- a/modules/purchase/configuration.py Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/purchase/configuration.py Wed Feb 25 11:37:37 2026 +0100
@@ -6,6 +6,7 @@
     CompanyMultiValueMixin, CompanyValueMixin)
 from trytond.pool import Pool
 from trytond.pyson import Eval, Id, TimeDelta
+from trytond.transaction import Transaction
 
 purchase_invoice_method = fields.Selection(
     'get_purchase_invoice_method', "Invoice Method")
@@ -89,5 +90,17 @@
     get_purchase_invoice_method = get_purchase_methods('invoice_method')
 
     @classmethod
+    def __register__(cls, module_name):
+        cursor = Transaction().connection.cursor()
+        table = cls.__table__()
+
+        super().__register__(module_name)
+
+        # Migration from 7.8: rename invoice method shipment to fulfillment
+        cursor.execute(*table.update(
+                [table.purchase_invoice_method], ['fulfillment'],
+                where=table.purchase_invoice_method == 'shipment'))
+
+    @classmethod
     def default_purchase_invoice_method(cls):
         return 'order'
diff -r e374c74141ca -r 4d2bb29276c1 modules/purchase/purchase.py
--- a/modules/purchase/purchase.py      Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/purchase/purchase.py      Wed Feb 25 11:37:37 2026 +0100
@@ -187,9 +187,10 @@
         "Total Cache", currency='currency', digits='currency')
     invoice_method = fields.Selection([
             ('manual', 'Manual'),
-            ('order', 'Based On Order'),
-            ('shipment', 'Based On Shipment'),
-            ], 'Invoice Method', required=True, states=_states)
+            ('order', "On Order"),
+            ('fulfillment', "On Fulfillment"),
+            ],
+        "Invoice Method", required=True, states=_states)
     invoice_state = fields.Selection([
             ('none', 'None'),
             ('pending', "Pending"),
@@ -372,6 +373,11 @@
                 [sql_table.invoice_state], ['pending'],
                 where=sql_table.invoice_state == 'waiting'))
 
+        # Migration from 7.8: rename invoice method shipment to fulfillment
+        cursor.execute(*sql_table.update(
+                [sql_table.invoice_method], ['fulfillment'],
+                where=sql_table.invoice_method == 'shipment'))
+
     @classmethod
     def order_number(cls, tables):
         table, _ = tables[None]
@@ -1005,8 +1011,8 @@
         purchases = [p for p in purchases if p.state in states]
         cls.lock(purchases)
         cls._process_invoice(purchases)
-        cls._process_shipment(purchases)
-        cls._process_invoice_shipment_states(purchases)
+        cls._process_fulfillment(purchases)
+        cls._process_invoice_fulfillment_states(purchases)
         cls._process_state(purchases)
 
     @classmethod
@@ -1029,7 +1035,7 @@
             purchase.copy_resources_to(invoice)
 
     @classmethod
-    def _process_shipment(cls, purchases):
+    def _process_fulfillment(cls, purchases):
         pool = Pool()
         Move = pool.get('stock.move')
         ShipmentInReturn = pool.get('stock.shipment.in.return')
@@ -1050,7 +1056,7 @@
             purchase.copy_resources_to(shipment)
 
     @classmethod
-    def _process_invoice_shipment_states(cls, purchases):
+    def _process_invoice_fulfillment_states(cls, purchases):
         pool = Pool()
         Line = pool.get('purchase.line')
         lines = []
@@ -1459,7 +1465,7 @@
             return
         skips = set(self.purchase.invoices_ignored)
         quantity = self.quantity
-        if self.purchase.invoice_method == 'shipment':
+        if self.purchase.invoice_method == 'fulfillment':
             moves_ignored = set(self.moves_ignored)
             for move in self.moves:
                 if move in moves_ignored:
@@ -1910,7 +1916,7 @@
                 or not self.product
                 or self.product.type == 'service'):
             return self.quantity
-        elif self.purchase.invoice_method == 'shipment':
+        elif self.purchase.invoice_method == 'fulfillment':
             quantity = 0.0
             for move in self.moves:
                 if move.state != 'done':
@@ -1951,7 +1957,7 @@
         moves = []
         if self.purchase.invoice_method in {'order', 'manual'}:
             moves.extend(self.moves)
-        elif (self.purchase.invoice_method == 'shipment'
+        elif (self.purchase.invoice_method == 'fulfillment'
                 and samesign(self.quantity, quantity)):
             for move in self.moves:
                 if move.state == 'done':
diff -r e374c74141ca -r 4d2bb29276c1 
modules/purchase/tests/scenario_purchase.rst
--- a/modules/purchase/tests/scenario_purchase.rst      Wed Feb 25 15:24:25 
2026 +0100
+++ b/modules/purchase/tests/scenario_purchase.rst      Wed Feb 25 11:37:37 
2026 +0100
@@ -213,7 +213,7 @@
     >>> purchase = Purchase()
     >>> purchase.party = supplier
     >>> purchase.payment_term = payment_term
-    >>> purchase.invoice_method = 'shipment'
+    >>> purchase.invoice_method = 'fulfillment'
     >>> purchase_line = PurchaseLine()
     >>> purchase.lines.append(purchase_line)
     >>> purchase_line.product = product
@@ -307,7 +307,7 @@
     >>> return_ = Purchase()
     >>> return_.party = supplier
     >>> return_.payment_term = payment_term
-    >>> return_.invoice_method = 'shipment'
+    >>> return_.invoice_method = 'fulfillment'
     >>> return_line = PurchaseLine()
     >>> return_.lines.append(return_line)
     >>> return_line.product = product
@@ -434,7 +434,7 @@
     >>> mix = Purchase()
     >>> mix.party = supplier
     >>> mix.payment_term = payment_term
-    >>> mix.invoice_method = 'shipment'
+    >>> mix.invoice_method = 'fulfillment'
     >>> mixline = PurchaseLine()
     >>> mix.lines.append(mixline)
     >>> mixline.product = product
@@ -530,7 +530,7 @@
     >>> purchase = Purchase()
     >>> purchase.party = supplier
     >>> purchase.payment_term = payment_term
-    >>> purchase.invoice_method = 'shipment'
+    >>> purchase.invoice_method = 'fulfillment'
     >>> line = purchase.lines.new()
     >>> line.product = product
     >>> line.quantity = 10.0
diff -r e374c74141ca -r 4d2bb29276c1 
modules/purchase/tests/scenario_purchase_line_cancelled_on_shipment.rst
--- a/modules/purchase/tests/scenario_purchase_line_cancelled_on_shipment.rst   
Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/purchase/tests/scenario_purchase_line_cancelled_on_shipment.rst   
Wed Feb 25 11:37:37 2026 +0100
@@ -48,7 +48,7 @@
 Purchase product::
 
     >>> purchase = Purchase(party=supplier)
-    >>> purchase.invoice_method = 'shipment'
+    >>> purchase.invoice_method = 'fulfillment'
     >>> line = purchase.lines.new()
     >>> line.product = product
     >>> line.quantity = 1
diff -r e374c74141ca -r 4d2bb29276c1 
modules/purchase_shipment_cost/tests/scenario_purchase_shipment_cost_with_account_stock_anglo_saxon.rst
--- 
a/modules/purchase_shipment_cost/tests/scenario_purchase_shipment_cost_with_account_stock_anglo_saxon.rst
   Wed Feb 25 15:24:25 2026 +0100
+++ 
b/modules/purchase_shipment_cost/tests/scenario_purchase_shipment_cost_with_account_stock_anglo_saxon.rst
   Wed Feb 25 11:37:37 2026 +0100
@@ -121,7 +121,7 @@
     >>> purchase = Purchase()
     >>> purchase.party = supplier
     >>> purchase.payment_term = payment_term
-    >>> purchase.invoice_method = 'shipment'
+    >>> purchase.invoice_method = 'fulfillment'
     >>> purchase_line = PurchaseLine()
     >>> purchase.lines.append(purchase_line)
     >>> purchase_line.product = product
diff -r e374c74141ca -r 4d2bb29276c1 modules/sale/CHANGELOG
--- a/modules/sale/CHANGELOG    Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/sale/CHANGELOG    Wed Feb 25 11:37:37 2026 +0100
@@ -1,3 +1,4 @@
+* Rename invoice method on shipment into on fulfillment
 * Add support for Python 3.14
 * Remove support for Python 3.9
 
diff -r e374c74141ca -r 4d2bb29276c1 modules/sale/configuration.py
--- a/modules/sale/configuration.py     Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/sale/configuration.py     Wed Feb 25 11:37:37 2026 +0100
@@ -9,6 +9,7 @@
     CompanyMultiValueMixin, CompanyValueMixin)
 from trytond.pool import Pool
 from trytond.pyson import Eval, Id, TimeDelta
+from trytond.transaction import Transaction
 
 sale_invoice_method = fields.Selection(
     'get_sale_invoice_methods', "Sale Invoice Method")
@@ -108,6 +109,18 @@
     get_sale_shipment_methods = get_sale_methods('shipment_method')
 
     @classmethod
+    def __register__(cls, module_name):
+        cursor = Transaction().connection.cursor()
+        table = cls.__table__()
+
+        super().__register__(module_name)
+
+        # Migration from 7.8: rename invoice method shipment to fulfillment
+        cursor.execute(*table.update(
+                [table.sale_invoice_method], ['fulfillment'],
+                where=table.sale_invoice_method == 'shipment'))
+
+    @classmethod
     def default_sale_invoice_method(cls):
         return 'order'
 
diff -r e374c74141ca -r 4d2bb29276c1 modules/sale/party.py
--- a/modules/sale/party.py     Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/sale/party.py     Wed Feb 25 11:37:37 2026 +0100
@@ -80,6 +80,18 @@
     get_sale_invoice_method = get_sale_methods('invoice_method')
     get_sale_shipment_method = get_sale_methods('shipment_method')
 
+    @classmethod
+    def __register__(cls, module_name):
+        cursor = Transaction().connection.cursor()
+        table = cls.__table__()
+
+        super().__register__(module_name)
+
+        # Migration from 7.8: rename invoice method shipment to fulfillment
+        cursor.execute(*table.update(
+                [table.sale_invoice_method], ['fulfillment'],
+                where=table.sale_invoice_method == 'shipment'))
+
 
 class PartyCustomerCurrency(ModelSQL, ValueMixin):
     __name__ = 'party.party.customer_currency'
diff -r e374c74141ca -r 4d2bb29276c1 modules/sale/sale.py
--- a/modules/sale/sale.py      Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/sale/sale.py      Wed Feb 25 11:37:37 2026 +0100
@@ -242,7 +242,7 @@
     invoice_method = fields.Selection([
             ('manual', 'Manual'),
             ('order', 'On Order Processed'),
-            ('shipment', 'On Shipment Sent'),
+            ('fulfillment', "On Fulfillment"),
             ],
         'Invoice Method', required=True, states={
             'readonly': Eval('state') != 'draft',
@@ -443,6 +443,11 @@
                 [sql_table.invoice_state], ['pending'],
                 where=sql_table.invoice_state == 'waiting'))
 
+        # Migration from 7.8: rename invoice method shipment to fulfillment
+        cursor.execute(*sql_table.update(
+                [sql_table.invoice_method], ['fulfillment'],
+                where=sql_table.invoice_method == 'shipment'))
+
     @classmethod
     def order_number(cls, tables):
         table, _ = tables[None]
@@ -818,7 +823,7 @@
                     'invoice_method', 'shipment_method'}):
             return
         for sale in sales:
-            if (sale.invoice_method == 'shipment'
+            if (sale.invoice_method == 'fulfillment'
                     and sale.shipment_method == 'invoice'):
                 raise SaleValidationError(
                     gettext('sale.msg_sale_invalid_method',
@@ -1193,8 +1198,8 @@
         sales = [s for s in sales if s.state in states]
         cls.lock(sales)
         cls._process_invoice(sales)
-        cls._process_shipment(sales)
-        cls._process_invoice_shipment_states(sales)
+        cls._process_fulfillment(sales)
+        cls._process_invoice_fulfillment_states(sales)
         cls._process_state(sales)
 
     @classmethod
@@ -1213,7 +1218,7 @@
             sale.copy_resources_to(invoice)
 
     @classmethod
-    def _process_shipment(cls, sales):
+    def _process_fulfillment(cls, sales):
         pool = Pool()
         ShipmentOut = pool.get('stock.shipment.out')
         ShipmentOutReturn = pool.get('stock.shipment.out.return')
@@ -1241,7 +1246,7 @@
                 sale.copy_resources_to(shipment)
 
     @classmethod
-    def _process_invoice_shipment_states(cls, sales):
+    def _process_invoice_fulfillment_states(cls, sales):
         pool = Pool()
         Line = pool.get('sale.line')
         lines = []
@@ -1608,7 +1613,7 @@
             return
         skips = set(self.sale.invoices_ignored)
         quantity = self.quantity
-        if self.sale.invoice_method == 'shipment':
+        if self.sale.invoice_method == 'fulfillment':
             moves_ignored = set(self.moves_ignored)
             for move in self.moves:
                 if move in moves_ignored:
@@ -2017,7 +2022,7 @@
                 or not self.product
                 or self.product.type == 'service'):
             return self.quantity
-        elif self.sale.invoice_method == 'shipment':
+        elif self.sale.invoice_method == 'fulfillment':
             quantity = 0.0
             for move in self.moves:
                 if move.state != 'done':
@@ -2059,7 +2064,7 @@
         if self.sale.invoice_method in {'order', 'manual'}:
             if self.sale.shipment_method not in {'order', 'manual'}:
                 moves.extend(self.moves)
-        elif (self.sale.invoice_method == 'shipment'
+        elif (self.sale.invoice_method == 'fulfillment'
                 and samesign(self.quantity, quantity)):
             for move in self.moves:
                 if move.state == 'done':
diff -r e374c74141ca -r 4d2bb29276c1 modules/sale/tests/scenario_sale.rst
--- a/modules/sale/tests/scenario_sale.rst      Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/sale/tests/scenario_sale.rst      Wed Feb 25 11:37:37 2026 +0100
@@ -214,7 +214,7 @@
     >>> sale = Sale()
     >>> sale.party = customer
     >>> sale.payment_term = payment_term
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> sale_line = SaleLine()
     >>> sale.lines.append(sale_line)
     >>> sale_line.product = product
@@ -372,7 +372,7 @@
     >>> return_ = Sale()
     >>> return_.party = customer
     >>> return_.payment_term = payment_term
-    >>> return_.invoice_method = 'shipment'
+    >>> return_.invoice_method = 'fulfillment'
     >>> return_line = SaleLine()
     >>> return_.lines.append(return_line)
     >>> return_line.product = product
@@ -514,7 +514,7 @@
     >>> mix = Sale()
     >>> mix.party = customer
     >>> mix.payment_term = payment_term
-    >>> mix.invoice_method = 'shipment'
+    >>> mix.invoice_method = 'fulfillment'
     >>> mixline = SaleLine()
     >>> mix.lines.append(mixline)
     >>> mixline.product = product
@@ -626,7 +626,7 @@
     >>> sale = Sale()
     >>> sale.party = customer
     >>> sale.payment_term = payment_term
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> line = sale.lines.new()
     >>> line.product = product
     >>> line.quantity = 10.0
diff -r e374c74141ca -r 4d2bb29276c1 
modules/sale/tests/scenario_sale_default_methods.rst
--- a/modules/sale/tests/scenario_sale_default_methods.rst      Wed Feb 25 
15:24:25 2026 +0100
+++ b/modules/sale/tests/scenario_sale_default_methods.rst      Wed Feb 25 
11:37:37 2026 +0100
@@ -17,7 +17,7 @@
     >>> Party = Model.get('party.party')
     >>> customer = Party(name='Customer')
     >>> customer.sale_shipment_method = 'invoice'
-    >>> customer.sale_invoice_method = 'shipment'
+    >>> customer.sale_invoice_method = 'fulfillment'
     >>> customer.save()
 
 Create a sale to to check default methods::
@@ -28,4 +28,4 @@
     >>> sale.shipment_method
     'invoice'
     >>> sale.invoice_method
-    'shipment'
+    'fulfillment'
diff -r e374c74141ca -r 4d2bb29276c1 
modules/sale/tests/scenario_sale_line_cancelled_on_shipment.rst
--- a/modules/sale/tests/scenario_sale_line_cancelled_on_shipment.rst   Wed Feb 
25 15:24:25 2026 +0100
+++ b/modules/sale/tests/scenario_sale_line_cancelled_on_shipment.rst   Wed Feb 
25 11:37:37 2026 +0100
@@ -49,7 +49,7 @@
 Sale product::
 
     >>> sale = Sale(party=customer)
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> line = sale.lines.new()
     >>> line.product = product
     >>> line.quantity = 1
diff -r e374c74141ca -r 4d2bb29276c1 
modules/sale_advance_payment/tests/scenario_sale_advance_payment_on_shipment.rst
--- 
a/modules/sale_advance_payment/tests/scenario_sale_advance_payment_on_shipment.rst
  Wed Feb 25 15:24:25 2026 +0100
+++ 
b/modules/sale_advance_payment/tests/scenario_sale_advance_payment_on_shipment.rst
  Wed Feb 25 11:37:37 2026 +0100
@@ -82,7 +82,7 @@
     >>> sale = Sale()
     >>> sale.party = customer
     >>> sale.advance_payment_term = advance_payment_term
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> line = sale.lines.new()
     >>> line.product = product
     >>> line.quantity = 10
diff -r e374c74141ca -r 4d2bb29276c1 modules/sale_credit_limit/sale.py
--- a/modules/sale_credit_limit/sale.py Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/sale_credit_limit/sale.py Wed Feb 25 11:37:37 2026 +0100
@@ -40,7 +40,7 @@
         if (self.type != 'line') or (self.quantity <= 0):
             return None
         quantity = self.quantity
-        if self.sale.invoice_method == 'shipment':
+        if self.sale.invoice_method == 'fulfillment':
             for move in self.moves_ignored:
                 quantity -= UoM.compute_qty(
                     move.unit, move.quantity, self.unit, round=False)
diff -r e374c74141ca -r 4d2bb29276c1 modules/sale_shipment_cost/sale.py
--- a/modules/sale_shipment_cost/sale.py        Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/sale_shipment_cost/sale.py        Wed Feb 25 11:37:37 2026 +0100
@@ -243,7 +243,7 @@
             super().process(sales)
 
     @classmethod
-    def _process_invoice_shipment_states(cls, sales):
+    def _process_invoice_fulfillment_states(cls, sales):
         pool = Pool()
         ShipmentOut = pool.get('stock.shipment.out')
         ShipmentCostSale = pool.get('stock.shipment.cost_sale')
@@ -256,7 +256,7 @@
                 else:
                     not_sent.append(sale)
 
-        super()._process_invoice_shipment_states(sales)
+        super()._process_invoice_fulfillment_states(sales)
 
         to_save, to_delete, shipments = [], [], set()
         for sale in sent:
@@ -453,7 +453,7 @@
             if self.sale.shipment_cost_method == 'shipment':
                 quantity = 0
             elif (self.sale.shipment_cost_method == 'order'
-                    and self.sale.invoice_method == 'shipment'):
+                    and self.sale.invoice_method == 'fulfillment'):
                 shipments = [
                     s for s in self.sale.shipments
                     if s.cost_sale_method == 'order']
diff -r e374c74141ca -r 4d2bb29276c1 
modules/sale_shipment_cost/tests/scenario_sale_shipment_cost.rst
--- a/modules/sale_shipment_cost/tests/scenario_sale_shipment_cost.rst  Wed Feb 
25 15:24:25 2026 +0100
+++ b/modules/sale_shipment_cost/tests/scenario_sale_shipment_cost.rst  Wed Feb 
25 11:37:37 2026 +0100
@@ -108,7 +108,7 @@
     >>> sale.party = customer
     >>> sale.carrier = carrier
     >>> sale.payment_term = payment_term
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> sale.shipment_cost_method
     'shipment'
     >>> sale_line = sale.lines.new()
@@ -250,7 +250,7 @@
     >>> sale.party = customer
     >>> sale.carrier = carrier
     >>> sale.payment_term = payment_term
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> sale.shipment_cost_method = 'order'
     >>> sale_line = sale.lines.new()
     >>> sale_line.product = product
@@ -289,7 +289,7 @@
     >>> sale.party = customer
     >>> sale.carrier = carrier
     >>> sale.payment_term = payment_term
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> sale.shipment_cost_method = None
     >>> sale_line = sale.lines.new()
     >>> sale_line.product = product
diff -r e374c74141ca -r 4d2bb29276c1 
modules/sale_shipment_cost/tests/scenario_sale_shipment_cost_cancelled_on_shipment.rst
--- 
a/modules/sale_shipment_cost/tests/scenario_sale_shipment_cost_cancelled_on_shipment.rst
    Wed Feb 25 15:24:25 2026 +0100
+++ 
b/modules/sale_shipment_cost/tests/scenario_sale_shipment_cost_cancelled_on_shipment.rst
    Wed Feb 25 11:37:37 2026 +0100
@@ -81,7 +81,7 @@
     >>> sale = Sale()
     >>> sale.party = customer
     >>> sale.carrier = carrier
-    >>> sale.invoice_method = 'shipment'
+    >>> sale.invoice_method = 'fulfillment'
     >>> sale.shipment_cost_method = 'shipment'
     >>> sale_line = sale.lines.new()
     >>> sale_line.product = product
diff -r e374c74141ca -r 4d2bb29276c1 modules/sale_shipment_grouping/sale.py
--- a/modules/sale_shipment_grouping/sale.py    Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/sale_shipment_grouping/sale.py    Wed Feb 25 11:37:37 2026 +0100
@@ -76,11 +76,11 @@
         return shipment
 
     @classmethod
-    def _process_shipment(cls, sales):
+    def _process_fulfillment(cls, sales):
         for method, sales in groupby(
                 sales, lambda s: s.shipment_grouping_method):
             if method:
                 for sale in sales:
-                    super()._process_shipment([sale])
+                    super()._process_fulfillment([sale])
             else:
-                super()._process_shipment(list(sales))
+                super()._process_fulfillment(list(sales))
diff -r e374c74141ca -r 4d2bb29276c1 modules/sale_supply/sale.py
--- a/modules/sale_supply/sale.py       Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/sale_supply/sale.py       Wed Feb 25 11:37:37 2026 +0100
@@ -23,7 +23,7 @@
         return done
 
     @classmethod
-    def _process_shipment(cls, sales):
+    def _process_fulfillment(cls, sales):
         pool = Pool()
         Product = pool.get('product.product')
 
@@ -49,7 +49,7 @@
             # supplier
             cls._process_supply(sub_sales, product_quantities)
             product_quantities.clear()
-        super()._process_shipment(sales)
+        super()._process_fulfillment(sales)
 
     @classmethod
     def _process_supply(cls, sales, product_quantities):
diff -r e374c74141ca -r 4d2bb29276c1 
modules/sale_supply_drop_shipment/purchase.py
--- a/modules/sale_supply_drop_shipment/purchase.py     Wed Feb 25 15:24:25 
2026 +0100
+++ b/modules/sale_supply_drop_shipment/purchase.py     Wed Feb 25 11:37:37 
2026 +0100
@@ -124,7 +124,7 @@
                     })
 
     @classmethod
-    def _process_shipment(cls, purchases):
+    def _process_fulfillment(cls, purchases):
         pool = Pool()
         DropShipment = pool.get('stock.shipment.drop')
 
@@ -138,7 +138,7 @@
                     drop_shipments.append(drop_shipment)
         DropShipment.save(drop_shipments)
         DropShipment.wait(drop_shipments)
-        super()._process_shipment(purchases)
+        super()._process_fulfillment(purchases)
 
     def create_drop_shipment(self):
         pool = Pool()
diff -r e374c74141ca -r 4d2bb29276c1 modules/web_shop_shopify/web.py
--- a/modules/web_shop_shopify/web.py   Wed Feb 25 15:24:25 2026 +0100
+++ b/modules/web_shop_shopify/web.py   Wed Feb 25 11:37:37 2026 +0100
@@ -293,7 +293,7 @@
     def get_sale(self, party=None):
         sale = super().get_sale(party=party)
         if self.type == 'shopify':
-            sale.invoice_method = 'shipment'
+            sale.invoice_method = 'fulfillment'
         return sale
 
     def update_sales(self, sales):

Reply via email to