diff --git a/modules/stock_package_shipping/CHANGELOG b/modules/stock_package_shipping/CHANGELOG
index 55e0ca17da..c9ed545f06 100644
--- a/modules/stock_package_shipping/CHANGELOG
+++ b/modules/stock_package_shipping/CHANGELOG
@@ -1,3 +1,4 @@
+* Manage internal shipment with transit
Version 7.4.0 - 2024-11-04
--------------------------
diff --git a/modules/stock_package_shipping/__init__.py b/modules/stock_package_shipping/__init__.py
index eeecf0436f..4d49fe2b06 100644
--- a/modules/stock_package_shipping/__init__.py
+++ b/modules/stock_package_shipping/__init__.py
@@ -11,6 +11,7 @@ def register():
stock.Package,
stock.ShipmentOut,
stock.ShipmentInReturn,
+ stock.ShipmentInternal,
carrier.Carrier,
module='stock_package_shipping', type_='model')
Pool.register(
diff --git a/modules/stock_package_shipping/stock.py b/modules/stock_package_shipping/stock.py
index 5b8e9dff00..7c763d75ab 100644
--- a/modules/stock_package_shipping/stock.py
+++ b/modules/stock_package_shipping/stock.py
@@ -310,6 +310,63 @@ class ShipmentInReturn(ShippingMixin, metaclass=PoolMeta):
return self.delivery_address
+class ShipmentInternal(ShippingMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.internal'
+
+ carrier = fields.Many2One(
+ 'carrier', "Carrier",
+ states={
+ 'invisible': ~Eval('transit_location'),
+ 'readonly': ~Eval('state').in_(['draft', 'waiting', 'assigned']),
+ })
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ shipping_invisible = ~Eval('transit_location')
+ for field in [
+ cls.shipping_reference,
+ cls.shipping_description,
+ cls.has_shipping_service]:
+ field.states['invisible'] = shipping_invisible
+ cls._buttons['create_shipping']['invisible'] |= shipping_invisible
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('packed')
+ def pack(cls, shipments):
+ super().pack(shipments)
+ pool = Pool()
+ Warning = pool.get('res.user.warning')
+ for shipment in shipments:
+ if not shipment.transit_location:
+ continue
+ if not shipment.carrier:
+ name = Warning.format('no_carrier', [shipment])
+ if Warning.check(name):
+ raise PackWarning(
+ gettext('stock_package_shipping'
+ '.msg_shipment_without_carrier',
+ shipment=shipment.rec_name))
+
+ @property
+ def shipping_allowed(self):
+ return {'packed', 'shipped'}
+
+ @property
+ def shipping_warehouse(self):
+ return self.warehouse
+
+ @property
+ def shipping_to(self):
+ return self.company.party
+
+ @property
+ def shipping_to_address(self):
+ if self.to_location.warehouse:
+ return self.to_location.warehouse.address
+
+
class CreateShipping(Wizard):
__name__ = 'stock.shipment.create_shipping'
diff --git a/modules/stock_package_shipping/stock.xml b/modules/stock_package_shipping/stock.xml
index 9489897576..e81d7acebf 100644
--- a/modules/stock_package_shipping/stock.xml
+++ b/modules/stock_package_shipping/stock.xml
@@ -58,6 +58,24 @@ this repository contains the full copyright notices and license terms. -->
Create Shipping for Packages
+
+ stock.shipment.internal
+
+ shipment_internal_form
+
+
+
+ stock.shipment.internal
+
+ shipment_internal_list
+
+
+
+ stock.shipment.internal
+ create_shipping
+ Create Shipping for Packages
+
+
Create Shipping
stock.shipment.create_shipping
diff --git a/modules/stock_package_shipping/view/shipment_internal_form.xml b/modules/stock_package_shipping/view/shipment_internal_form.xml
new file mode 100644
index 0000000000..021413d623
--- /dev/null
+++ b/modules/stock_package_shipping/view/shipment_internal_form.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping/view/shipment_internal_list.xml b/modules/stock_package_shipping/view/shipment_internal_list.xml
new file mode 100644
index 0000000000..ee618dcba4
--- /dev/null
+++ b/modules/stock_package_shipping/view/shipment_internal_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+