, 2017\n"
-"Language-Team: Vietnamese (Viet Nam) (https://www.transifex.com/oca/"
-"teams/23907/vi_VN/)\n"
+"Language-Team: Vietnamese (Viet Nam) (https://www.transifex.com/oca/teams/"
+"23907/vi_VN/)\n"
"Language: vi_VN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,7 +21,14 @@ msgstr ""
#. module: sale_order_line_sequence
#: model_terms:ir.ui.view,arch_db:sale_order_line_sequence.report_saleorder_document_sequence
-msgid "Line Number"
+msgid "#"
+msgstr ""
+
+#. module: sale_order_line_sequence
+#: model:ir.model.fields,field_description:sale_order_line_sequence.field_account_move_line__display_name
+#: model:ir.model.fields,field_description:sale_order_line_sequence.field_sale_order__display_name
+#: model:ir.model.fields,field_description:sale_order_line_sequence.field_sale_order_line__display_name
+msgid "Display Name"
msgstr ""
#. module: sale_order_line_sequence
@@ -34,6 +41,13 @@ msgstr ""
msgid "Gives the sequence of this line when displaying the sale order."
msgstr ""
+#. module: sale_order_line_sequence
+#: model:ir.model.fields,field_description:sale_order_line_sequence.field_account_move_line__id
+#: model:ir.model.fields,field_description:sale_order_line_sequence.field_sale_order__id
+#: model:ir.model.fields,field_description:sale_order_line_sequence.field_sale_order_line__id
+msgid "ID"
+msgstr ""
+
#. module: sale_order_line_sequence
#: model:ir.model,name:sale_order_line_sequence.model_account_move_line
msgid "Journal Item"
@@ -41,7 +55,6 @@ msgstr ""
#. module: sale_order_line_sequence
#: model:ir.model.fields,field_description:sale_order_line_sequence.field_sale_order_line__visible_sequence
-#: model_terms:ir.ui.view,arch_db:sale_order_line_sequence.report_invoice_document_inherit_sale_sequence
msgid "Line Number"
msgstr ""
diff --git a/sale_order_line_sequence/i18n/zh_CN.po b/sale_order_line_sequence/i18n/zh_CN.po
index 33f307c748d..34ee58172ab 100644
--- a/sale_order_line_sequence/i18n/zh_CN.po
+++ b/sale_order_line_sequence/i18n/zh_CN.po
@@ -22,7 +22,14 @@ msgstr ""
#. module: sale_order_line_sequence
#: model_terms:ir.ui.view,arch_db:sale_order_line_sequence.report_saleorder_document_sequence
-msgid "Line Number"
+msgid "#"
+msgstr ""
+
+#. module: sale_order_line_sequence
+#: model:ir.model.fields,field_description:sale_order_line_sequence.field_account_move_line__display_name
+#: model:ir.model.fields,field_description:sale_order_line_sequence.field_sale_order__display_name
+#: model:ir.model.fields,field_description:sale_order_line_sequence.field_sale_order_line__display_name
+msgid "Display Name"
msgstr ""
#. module: sale_order_line_sequence
@@ -35,6 +42,13 @@ msgstr ""
msgid "Gives the sequence of this line when displaying the sale order."
msgstr "显示销售订单时给出此行的顺序。"
+#. module: sale_order_line_sequence
+#: model:ir.model.fields,field_description:sale_order_line_sequence.field_account_move_line__id
+#: model:ir.model.fields,field_description:sale_order_line_sequence.field_sale_order__id
+#: model:ir.model.fields,field_description:sale_order_line_sequence.field_sale_order_line__id
+msgid "ID"
+msgstr ""
+
#. module: sale_order_line_sequence
#: model:ir.model,name:sale_order_line_sequence.model_account_move_line
msgid "Journal Item"
@@ -42,7 +56,6 @@ msgstr ""
#. module: sale_order_line_sequence
#: model:ir.model.fields,field_description:sale_order_line_sequence.field_sale_order_line__visible_sequence
-#: model_terms:ir.ui.view,arch_db:sale_order_line_sequence.report_invoice_document_inherit_sale_sequence
msgid "Line Number"
msgstr "行号"
diff --git a/sale_order_line_sequence/static/description/index.html b/sale_order_line_sequence/static/description/index.html
index c7091015d3e..85d370c71ee 100644
--- a/sale_order_line_sequence/static/description/index.html
+++ b/sale_order_line_sequence/static/description/index.html
@@ -372,7 +372,7 @@ Sale Order Line Sequence
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:1f4f0371b977c0b0bb62d6e8ddd3dfa9bc4f67f08a0e5691182f5d751823c28a
+!! source digest: sha256:1dc4f5108a898f3b451438606c0f7ea08db16ccd68e103f74fe987dfc5ea0a89
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Displays the sequence of Sale order line and helps to maintain the
diff --git a/sale_order_line_sequence/views/account_move_view.xml b/sale_order_line_sequence/views/account_move_view.xml
index ae52ce99296..ecaaf7861bf 100644
--- a/sale_order_line_sequence/views/account_move_view.xml
+++ b/sale_order_line_sequence/views/account_move_view.xml
@@ -12,6 +12,8 @@
diff --git a/sale_order_line_sequence/views/report_invoice.xml b/sale_order_line_sequence/views/report_invoice.xml
index 3ea530f3cab..05f05709af8 100644
--- a/sale_order_line_sequence/views/report_invoice.xml
+++ b/sale_order_line_sequence/views/report_invoice.xml
@@ -8,9 +8,7 @@
|
- Line Number
- |
+ >#
diff --git a/sale_order_line_sequence/views/report_saleorder.xml b/sale_order_line_sequence/views/report_saleorder.xml
index 90de8161cea..4c340b52b1c 100644
--- a/sale_order_line_sequence/views/report_saleorder.xml
+++ b/sale_order_line_sequence/views/report_saleorder.xml
@@ -9,7 +9,7 @@
position="before"
>
- Line Number
+ #
|
+
+
+
+
+ |
+
+ |
+
+
+
diff --git a/sale_order_line_sequence/views/sale_view.xml b/sale_order_line_sequence/views/sale_view.xml
index 26db4711d0e..38e6d488ace 100644
--- a/sale_order_line_sequence/views/sale_view.xml
+++ b/sale_order_line_sequence/views/sale_view.xml
@@ -14,7 +14,7 @@
expr="//field[@name='order_line']/list/field[@name='product_id']"
position="before"
>
-
+
diff --git a/sale_order_warehouse_header/README.rst b/sale_order_warehouse_header/README.rst
new file mode 100644
index 00000000000..d23e7085a35
--- /dev/null
+++ b/sale_order_warehouse_header/README.rst
@@ -0,0 +1,84 @@
+.. image:: https://odoo-community.org/readme-banner-image
+ :target: https://odoo-community.org/get-involved?utm_source=readme
+ :alt: Odoo Community Association
+
+===========================
+Sale Order Warehouse Header
+===========================
+
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:695a850cd55e797f1d63c2c044b9053a51bf4dd9a356b3e13b828fe09336f654
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github
+ :target: https://github.com/OCA/sale-workflow/tree/19.0/sale_order_warehouse_header
+ :alt: OCA/sale-workflow
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/sale-workflow-19-0/sale-workflow-19-0-sale_order_warehouse_header
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/sale-workflow&target_branch=19.0
+ :alt: Try me on Runboat
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+Moves warehouse field in sales orders form to header, so it becomes more
+accessible. Improvements in the search view:
+
+- Filter by warehouse.
+- Group by warehouse.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us to smash it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+-------
+
+* Solvos
+
+Contributors
+------------
+
+- Iria Alonso
+
+Maintainers
+-----------
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+This module is part of the `OCA/sale-workflow `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/sale_order_warehouse_header/__init__.py b/sale_order_warehouse_header/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/sale_order_warehouse_header/__manifest__.py b/sale_order_warehouse_header/__manifest__.py
new file mode 100644
index 00000000000..1edc0115a3f
--- /dev/null
+++ b/sale_order_warehouse_header/__manifest__.py
@@ -0,0 +1,24 @@
+# © 2024 Solvos Consultoría Informática ()
+# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
+{
+ "name": "Sale Order Warehouse Header",
+ "summary": """
+ Moves warehouse field in sales orders form to header,
+ so it becomes more accessible.
+ Improvements in the search view:
+ - Filter by warehouse.
+ - Group by warehouse.
+ """,
+ "author": "Solvos, Odoo Community Association (OCA)",
+ "license": "AGPL-3",
+ "version": "19.0.1.0.0",
+ "category": "Inventory/Purchase",
+ "website": "https://github.com/OCA/sale-workflow",
+ "depends": [
+ "sale_stock",
+ ],
+ "data": [
+ "views/sale_order_views.xml",
+ ],
+ "installable": True,
+}
diff --git a/sale_order_warehouse_header/i18n/es.po b/sale_order_warehouse_header/i18n/es.po
new file mode 100644
index 00000000000..6ba8c30c245
--- /dev/null
+++ b/sale_order_warehouse_header/i18n/es.po
@@ -0,0 +1,21 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * sale_order_warehouse_header
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 18.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-05-25 14:01+0000\n"
+"PO-Revision-Date: 2026-05-25 14:01+0000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: sale_order_warehouse_header
+#: model_terms:ir.ui.view,arch_db:sale_order_warehouse_header.sale_order_view_search
+msgid "Warehouse"
+msgstr "Almacén"
diff --git a/sale_order_warehouse_header/i18n/sale_order_warehouse_header.pot b/sale_order_warehouse_header/i18n/sale_order_warehouse_header.pot
new file mode 100644
index 00000000000..98a16de5776
--- /dev/null
+++ b/sale_order_warehouse_header/i18n/sale_order_warehouse_header.pot
@@ -0,0 +1,19 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * sale_order_warehouse_header
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 19.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: sale_order_warehouse_header
+#: model_terms:ir.ui.view,arch_db:sale_order_warehouse_header.view_sales_order_filter_inherit_warehouse_header
+msgid "Warehouse"
+msgstr ""
diff --git a/sale_order_warehouse_header/pyproject.toml b/sale_order_warehouse_header/pyproject.toml
new file mode 100644
index 00000000000..4231d0cccb3
--- /dev/null
+++ b/sale_order_warehouse_header/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/sale_order_warehouse_header/readme/CONTRIBUTORS.md b/sale_order_warehouse_header/readme/CONTRIBUTORS.md
new file mode 100644
index 00000000000..1f43251f443
--- /dev/null
+++ b/sale_order_warehouse_header/readme/CONTRIBUTORS.md
@@ -0,0 +1 @@
+* Iria Alonso \
diff --git a/sale_order_warehouse_header/readme/DESCRIPTION.md b/sale_order_warehouse_header/readme/DESCRIPTION.md
new file mode 100644
index 00000000000..05144ca1ad2
--- /dev/null
+++ b/sale_order_warehouse_header/readme/DESCRIPTION.md
@@ -0,0 +1,4 @@
+Moves warehouse field in sales orders form to header, so it becomes more accessible.
+Improvements in the search view:
+- Filter by warehouse.
+- Group by warehouse.
diff --git a/sale_order_warehouse_header/static/description/icon.png b/sale_order_warehouse_header/static/description/icon.png
new file mode 100644
index 00000000000..3a0328b516c
Binary files /dev/null and b/sale_order_warehouse_header/static/description/icon.png differ
diff --git a/sale_order_warehouse_header/static/description/index.html b/sale_order_warehouse_header/static/description/index.html
new file mode 100644
index 00000000000..35cee625f5c
--- /dev/null
+++ b/sale_order_warehouse_header/static/description/index.html
@@ -0,0 +1,434 @@
+
+
+
+
+
+README.rst
+
+
+
+
+
+
diff --git a/sale_order_warehouse_header/views/sale_order_views.xml b/sale_order_warehouse_header/views/sale_order_views.xml
new file mode 100644
index 00000000000..43445f7b437
--- /dev/null
+++ b/sale_order_warehouse_header/views/sale_order_views.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
diff --git a/sale_partner_address_restrict/README.rst b/sale_partner_address_restrict/README.rst
new file mode 100644
index 00000000000..b651fb3474a
--- /dev/null
+++ b/sale_partner_address_restrict/README.rst
@@ -0,0 +1,100 @@
+.. image:: https://odoo-community.org/readme-banner-image
+ :target: https://odoo-community.org/get-involved?utm_source=readme
+ :alt: Odoo Community Association
+
+=============================
+Sale Partner Address Restrict
+=============================
+
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:3d31580e313027df28d382ef9f3393dee8f63afff830ad19dc739801e8f700e7
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github
+ :target: https://github.com/OCA/sale-workflow/tree/19.0/sale_partner_address_restrict
+ :alt: OCA/sale-workflow
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/sale-workflow-19-0/sale-workflow-19-0-sale_partner_address_restrict
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/sale-workflow&target_branch=19.0
+ :alt: Try me on Runboat
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module restricts the addresses to be used in the sales order form
+to only addresses of the selected customer.
+
+When managing dropship delivery addresses, a delivery address needs to
+be created for the buyer main contact. You can then mark the checkbox
+'Dropship Address' on the delivery address to prevent the buyer main
+contact name to be displayed as part of the delivery address name.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Configuration
+=============
+
+- Go to Sales > Configuration > Settings > Quotation & Orders > Sale
+ Partner Address Restriction
+- Check the box if you want to restrict available partners for Delivery
+ and Invoicing addresses to partners that belong to the selected
+ Customer.
+
+If you are managing dropship delivery addresses, you can mark the
+checkbox 'Dropship Address' in the addresses to prevent the parent
+contact name to be displayed.
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us to smash it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+-------
+
+* ForgeFlow
+
+Contributors
+------------
+
+- Marina Alapont
+- Denis Roussel denis.roussel@acsone.eu
+
+Maintainers
+-----------
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+This module is part of the `OCA/sale-workflow `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/sale_partner_address_restrict/__init__.py b/sale_partner_address_restrict/__init__.py
new file mode 100644
index 00000000000..0650744f6bc
--- /dev/null
+++ b/sale_partner_address_restrict/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/sale_partner_address_restrict/__manifest__.py b/sale_partner_address_restrict/__manifest__.py
new file mode 100644
index 00000000000..7202c4dc97e
--- /dev/null
+++ b/sale_partner_address_restrict/__manifest__.py
@@ -0,0 +1,23 @@
+# Copyright 2024 ForgeFlow S.L.
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+{
+ "name": "Sale Partner Address Restrict",
+ "summary": "Restrict addresses domain in the sales order form"
+ " taking into account the partner selected",
+ "version": "19.0.1.0.0",
+ "category": "Sales",
+ "website": "https://github.com/OCA/sale-workflow",
+ "author": "ForgeFlow, Odoo Community Association (OCA)",
+ "license": "AGPL-3",
+ "installable": True,
+ "depends": [
+ "base_partition",
+ "sale",
+ ],
+ "data": [
+ "views/sale_order_view.xml",
+ "views/res_config_settings.xml",
+ "views/res_partner_views.xml",
+ ],
+}
diff --git a/sale_partner_address_restrict/i18n/it.po b/sale_partner_address_restrict/i18n/it.po
new file mode 100644
index 00000000000..86a557f5437
--- /dev/null
+++ b/sale_partner_address_restrict/i18n/it.po
@@ -0,0 +1,33 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * sale_partner_address_restrict
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2024-08-26 12:06+0000\n"
+"Last-Translator: mymage \n"
+"Language-Team: none\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 5.6.2\n"
+
+#. module: sale_partner_address_restrict
+#. odoo-python
+#: code:addons/sale_partner_address_restrict/models/sale_order.py:0
+#, python-format
+msgid ""
+"Invoice and shipping addresses must be child addresses of the selected "
+"partner or the selected partner itself."
+msgstr ""
+"Gli indirizzi di fatturazione e di spedizione devono essere indirizzi figli "
+"del partner selezionato o del partner selezionato stesso."
+
+#. module: sale_partner_address_restrict
+#: model:ir.model,name:sale_partner_address_restrict.model_sale_order
+msgid "Sales Order"
+msgstr "Ordine di vendita"
diff --git a/sale_partner_address_restrict/i18n/sale_partner_address_restrict.pot b/sale_partner_address_restrict/i18n/sale_partner_address_restrict.pot
new file mode 100644
index 00000000000..75c2bb4117f
--- /dev/null
+++ b/sale_partner_address_restrict/i18n/sale_partner_address_restrict.pot
@@ -0,0 +1,101 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * sale_partner_address_restrict
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 19.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: sale_partner_address_restrict
+#: model_terms:ir.ui.view,arch_db:sale_partner_address_restrict.res_config_settings_view_form
+msgid "Address restriction"
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#: model:ir.model.fields,help:sale_partner_address_restrict.field_res_company__sale_partner_address_restriction
+#: model:ir.model.fields,help:sale_partner_address_restrict.field_res_config_settings__sale_partner_address_restriction
+msgid ""
+"Check this box if you want to restrict partner addresses selection in sale "
+"orders. They should depends on the Customer filled in."
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#: model_terms:ir.ui.view,arch_db:sale_partner_address_restrict.res_config_settings_view_form
+msgid ""
+"Check this if you want to restrict the address selection to contacts of same"
+" company."
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#: model:ir.model,name:sale_partner_address_restrict.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#: model:ir.model,name:sale_partner_address_restrict.model_res_config_settings
+msgid "Config Settings"
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#: model:ir.model,name:sale_partner_address_restrict.model_res_partner
+msgid "Contact"
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_res_company__display_name
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_res_config_settings__display_name
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_res_partner__display_name
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_sale_order__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_res_partner__is_dropship_address
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_res_users__is_dropship_address
+msgid "Dropship Address"
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_res_company__id
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_res_config_settings__id
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_res_partner__id
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_sale_order__id
+msgid "ID"
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#. odoo-python
+#: code:addons/sale_partner_address_restrict/models/sale_order.py:0
+msgid ""
+"Invoice and shipping addresses must be child addresses of the selected "
+"partner or the selected partner itself."
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_sale_order__partner_address_restriction_domain
+msgid "Partner Address Restriction Domain"
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_res_company__sale_partner_address_restriction
+#: model:ir.model.fields,field_description:sale_partner_address_restrict.field_res_config_settings__sale_partner_address_restriction
+msgid "Sale Partner Address Restriction"
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#: model:ir.model,name:sale_partner_address_restrict.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
+#. module: sale_partner_address_restrict
+#: model:ir.model.fields,help:sale_partner_address_restrict.field_sale_order__partner_address_restriction_domain
+msgid ""
+"This is the computed domain to filter delivery and invoicing addresses."
+msgstr ""
diff --git a/sale_partner_address_restrict/models/__init__.py b/sale_partner_address_restrict/models/__init__.py
new file mode 100644
index 00000000000..22c2a9c37ef
--- /dev/null
+++ b/sale_partner_address_restrict/models/__init__.py
@@ -0,0 +1,4 @@
+from . import sale_order
+from . import res_company
+from . import res_partner
+from . import res_config_settings
diff --git a/sale_partner_address_restrict/models/res_company.py b/sale_partner_address_restrict/models/res_company.py
new file mode 100644
index 00000000000..ac0b000eb3d
--- /dev/null
+++ b/sale_partner_address_restrict/models/res_company.py
@@ -0,0 +1,13 @@
+# Copyright 2024 ACSONE SA/NV
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class ResCompany(models.Model):
+ _inherit = "res.company"
+
+ sale_partner_address_restriction = fields.Boolean(
+ help="Check this box if you want to restrict partner addresses selection "
+ "in sale orders. They should depends on the Customer filled in."
+ )
diff --git a/sale_partner_address_restrict/models/res_config_settings.py b/sale_partner_address_restrict/models/res_config_settings.py
new file mode 100644
index 00000000000..d354e3aaa45
--- /dev/null
+++ b/sale_partner_address_restrict/models/res_config_settings.py
@@ -0,0 +1,13 @@
+# Copyright 2024 ACSONE SA/NV
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class ResConfigSettings(models.TransientModel):
+ _inherit = "res.config.settings"
+
+ sale_partner_address_restriction = fields.Boolean(
+ related="company_id.sale_partner_address_restriction",
+ readonly=False,
+ )
diff --git a/sale_partner_address_restrict/models/res_partner.py b/sale_partner_address_restrict/models/res_partner.py
new file mode 100644
index 00000000000..9df70e76a76
--- /dev/null
+++ b/sale_partner_address_restrict/models/res_partner.py
@@ -0,0 +1,16 @@
+# Copyright 2025 ForgeFlow S.L.
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from odoo import fields, models
+
+
+class ResPartner(models.Model):
+ _inherit = "res.partner"
+
+ is_dropship_address = fields.Boolean(string="Dropship Address")
+
+ def _get_complete_name(self):
+ res = super()._get_complete_name()
+ if not self.is_dropship_address or not self.name or not self.type == "delivery":
+ return res
+ return self.name.strip()
diff --git a/sale_partner_address_restrict/models/sale_order.py b/sale_partner_address_restrict/models/sale_order.py
new file mode 100644
index 00000000000..6c85de83e1d
--- /dev/null
+++ b/sale_partner_address_restrict/models/sale_order.py
@@ -0,0 +1,49 @@
+from odoo import api, fields, models
+from odoo.exceptions import ValidationError
+
+
+class SaleOrder(models.Model):
+ _inherit = "sale.order"
+
+ partner_address_restriction_domain = fields.Binary(
+ compute="_compute_partner_address_restriction_domain",
+ help="This is the computed domain to filter delivery and invoicing addresses.",
+ )
+
+ @api.depends("partner_id", "company_id.sale_partner_address_restriction")
+ def _compute_partner_address_restriction_domain(self):
+ for activated, activated_sales in self.partition(
+ lambda sale: sale.company_id.sale_partner_address_restriction
+ ).items():
+ if not activated:
+ activated_sales.partner_address_restriction_domain = [(1, "=", 1)]
+ continue
+ for company, sales in activated_sales.partition("company_id").items():
+ for sale in sales:
+ sale.partner_address_restriction_domain = [
+ ("commercial_partner_id", "=", sale.partner_id.id),
+ "|",
+ ("company_id", "=", False),
+ ("company_id", "=", company.id),
+ ]
+
+ @api.constrains("partner_id", "partner_invoice_id", "partner_shipping_id")
+ def _check_partner_addresses(self):
+ for order in self:
+ if (
+ order.company_id.sale_partner_address_restriction
+ and order.partner_id
+ and (
+ (order.partner_invoice_id.commercial_partner_id != order.partner_id)
+ or (
+ order.partner_shipping_id.commercial_partner_id
+ != order.partner_id
+ )
+ )
+ ):
+ raise ValidationError(
+ self.env._(
+ "Invoice and shipping addresses must be child addresses"
+ " of the selected partner or the selected partner itself."
+ )
+ )
diff --git a/sale_partner_address_restrict/pyproject.toml b/sale_partner_address_restrict/pyproject.toml
new file mode 100644
index 00000000000..4231d0cccb3
--- /dev/null
+++ b/sale_partner_address_restrict/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/sale_partner_address_restrict/readme/CONFIGURE.md b/sale_partner_address_restrict/readme/CONFIGURE.md
new file mode 100644
index 00000000000..a31e5e07f6e
--- /dev/null
+++ b/sale_partner_address_restrict/readme/CONFIGURE.md
@@ -0,0 +1,6 @@
+- Go to Sales \> Configuration \> Settings \> Quotation & Orders \> Sale Partner Address Restriction
+- Check the box if you want to restrict available partners for Delivery and Invoicing addresses to
+ partners that belong to the selected Customer.
+
+If you are managing dropship delivery addresses, you can mark the checkbox 'Dropship Address'
+in the addresses to prevent the parent contact name to be displayed.
diff --git a/sale_partner_address_restrict/readme/CONTRIBUTORS.md b/sale_partner_address_restrict/readme/CONTRIBUTORS.md
new file mode 100644
index 00000000000..c75d6e6ffbf
--- /dev/null
+++ b/sale_partner_address_restrict/readme/CONTRIBUTORS.md
@@ -0,0 +1,2 @@
+- Marina Alapont \<\>
+- Denis Roussel
diff --git a/sale_partner_address_restrict/readme/DESCRIPTION.md b/sale_partner_address_restrict/readme/DESCRIPTION.md
new file mode 100644
index 00000000000..3a685f9b83f
--- /dev/null
+++ b/sale_partner_address_restrict/readme/DESCRIPTION.md
@@ -0,0 +1,7 @@
+This module restricts the addresses to be used in the sales order form to only
+addresses of the selected customer.
+
+When managing dropship delivery addresses, a delivery address needs to be created
+for the buyer main contact. You can then mark the checkbox 'Dropship Address' on
+the delivery address to prevent the buyer main contact name to be displayed as
+part of the delivery address name.
diff --git a/sale_partner_address_restrict/static/description/icon.png b/sale_partner_address_restrict/static/description/icon.png
new file mode 100644
index 00000000000..3a0328b516c
Binary files /dev/null and b/sale_partner_address_restrict/static/description/icon.png differ
diff --git a/sale_partner_address_restrict/static/description/index.html b/sale_partner_address_restrict/static/description/index.html
new file mode 100644
index 00000000000..85df9502162
--- /dev/null
+++ b/sale_partner_address_restrict/static/description/index.html
@@ -0,0 +1,449 @@
+
+
+
+
+
+README.rst
+
+
+
+
+
+
+
+
+
+
+
Sale Partner Address Restrict
+
+

+
This module restricts the addresses to be used in the sales order form
+to only addresses of the selected customer.
+
When managing dropship delivery addresses, a delivery address needs to
+be created for the buyer main contact. You can then mark the checkbox
+‘Dropship Address’ on the delivery address to prevent the buyer main
+contact name to be displayed as part of the delivery address name.
+
Table of contents
+
+
+
+
+- Go to Sales > Configuration > Settings > Quotation & Orders > Sale
+Partner Address Restriction
+- Check the box if you want to restrict available partners for Delivery
+and Invoicing addresses to partners that belong to the selected
+Customer.
+
+
If you are managing dropship delivery addresses, you can mark the
+checkbox ‘Dropship Address’ in the addresses to prevent the parent
+contact name to be displayed.
+
+
+
+
Bugs are tracked on GitHub Issues.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us to smash it by providing a detailed and welcomed
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+
+
+
+
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
This module is part of the OCA/sale-workflow project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
+
+
diff --git a/sale_partner_address_restrict/tests/__init__.py b/sale_partner_address_restrict/tests/__init__.py
new file mode 100644
index 00000000000..6f699d0d8ba
--- /dev/null
+++ b/sale_partner_address_restrict/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_sale_order
diff --git a/sale_partner_address_restrict/tests/test_sale_order.py b/sale_partner_address_restrict/tests/test_sale_order.py
new file mode 100644
index 00000000000..4f069df5f1a
--- /dev/null
+++ b/sale_partner_address_restrict/tests/test_sale_order.py
@@ -0,0 +1,91 @@
+from odoo.exceptions import ValidationError
+from odoo.tests import Form
+
+from odoo.addons.base.tests.common import BaseCommon
+
+
+class TestSaleOrder(BaseCommon):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls.partner1 = cls.env["res.partner"].create({"name": "Test Partner 1"})
+ cls.child_1 = cls.env["res.partner"].create(
+ {"name": "Child 1", "parent_id": cls.partner1.id, "type": "delivery"}
+ )
+ cls.child_2 = cls.env["res.partner"].create(
+ {"name": "Child 2", "parent_id": cls.partner1.id}
+ )
+
+ cls.partner2 = cls.env["res.partner"].create({"name": "Test Partner 2"})
+ cls.partner3 = cls.env["res.partner"].create({"name": "Test Partner 3"})
+
+ cls.env.user.group_ids += cls.env.ref("account.group_delivery_invoice_address")
+ cls.env.company.sale_partner_address_restriction = True
+
+ def test_sale_order_address_domain(self):
+ order_form = Form(self.env["sale.order"])
+ order_form.partner_id = self.partner1
+ sale_order = order_form.save()
+
+ expected_domain = [
+ ("commercial_partner_id", "=", sale_order.partner_id.id),
+ "|",
+ ("company_id", "=", False),
+ ("company_id", "=", sale_order.company_id.id),
+ ]
+
+ partners = self.env["res.partner"].search(expected_domain)
+ self.assertEqual(len(partners), 3)
+
+ with Form(sale_order) as sale_order:
+ sale_order.partner_id = self.partner2
+ expected_domain = [
+ ("commercial_partner_id", "=", sale_order.partner_id.id),
+ "|",
+ ("company_id", "=", False),
+ ("company_id", "=", sale_order.company_id.id),
+ ]
+ partners = self.env["res.partner"].search(expected_domain)
+ self.assertEqual(len(partners), 1)
+
+ def test_sale_order_partner_unallowed(self):
+ order_form = Form(self.env["sale.order"])
+ order_form.partner_id = self.partner1
+ sale_order = order_form.save()
+ with self.assertRaises(ValidationError):
+ with Form(sale_order) as sale_order:
+ sale_order.partner_shipping_id = self.partner3
+
+ def test_sale_order_partner_allowed(self):
+ self.env.company.sale_partner_address_restriction = False
+ order_form = Form(self.env["sale.order"])
+ order_form.partner_id = self.partner1
+ sale_order = order_form.save()
+ with Form(sale_order) as sale_order:
+ sale_order.partner_shipping_id = self.partner3
+
+ def test_sale_order_address_constraint(self):
+ with self.assertRaises(ValidationError):
+ self.env["sale.order"].create(
+ {
+ "partner_id": self.partner1.id,
+ "partner_invoice_id": self.partner2.id,
+ "partner_shipping_id": self.child_2.id,
+ }
+ )
+
+ def test_sale_order_address_no_constraint(self):
+ self.env.company.sale_partner_address_restriction = False
+ self.env["sale.order"].create(
+ {
+ "partner_id": self.partner1.id,
+ "partner_invoice_id": self.partner2.id,
+ "partner_shipping_id": self.child_2.id,
+ }
+ )
+
+ def test_dropship_delivery_address(self):
+ self.assertIn(self.partner1.name, self.child_1.display_name)
+ self.child_1.is_dropship_address = True
+ self.child_1._compute_display_name()
+ self.assertNotIn(self.partner1.name, self.child_1.display_name)
diff --git a/sale_partner_address_restrict/views/res_config_settings.xml b/sale_partner_address_restrict/views/res_config_settings.xml
new file mode 100644
index 00000000000..f1bc55b37a8
--- /dev/null
+++ b/sale_partner_address_restrict/views/res_config_settings.xml
@@ -0,0 +1,22 @@
+
+
+
+
+ res.config.settings.view.form.inherit.sale
+ res.config.settings
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sale_partner_address_restrict/views/res_partner_views.xml b/sale_partner_address_restrict/views/res_partner_views.xml
new file mode 100644
index 00000000000..70b947af97e
--- /dev/null
+++ b/sale_partner_address_restrict/views/res_partner_views.xml
@@ -0,0 +1,24 @@
+
+
+
+ res.partner.form - sale_partner_address_restrict_dropshipping
+ res.partner
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sale_partner_address_restrict/views/sale_order_view.xml b/sale_partner_address_restrict/views/sale_order_view.xml
new file mode 100644
index 00000000000..4f2e097c057
--- /dev/null
+++ b/sale_partner_address_restrict/views/sale_order_view.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ sale.order.form (in partner_invoicing_mode)
+ sale.order
+
+
+
+
+
+
+ partner_address_restriction_domain
+
+
+ partner_address_restriction_domain
+
+
+
+
diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml
index 06abcec18bb..63eee3efd30 100644
--- a/setup/_metapackage/pyproject.toml
+++ b/setup/_metapackage/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "odoo-addons-oca-sale-workflow"
-version = "19.0.20260817.1"
+version = "19.0.20260818.1"
dependencies = [
"odoo-addon-partner_sale_pivot==19.0.*",
"odoo-addon-portal_sale_list_extra_info==19.0.*",
@@ -59,6 +59,8 @@ dependencies = [
"odoo-addon-sale_order_split_strategy==19.0.*",
"odoo-addon-sale_order_tag==19.0.*",
"odoo-addon-sale_order_type==19.0.*",
+ "odoo-addon-sale_order_warehouse_header==19.0.*",
+ "odoo-addon-sale_partner_address_restrict==19.0.*",
"odoo-addon-sale_partner_delay==19.0.*",
"odoo-addon-sale_partner_incoterm==19.0.*",
"odoo-addon-sale_partner_selectable_option==19.0.*",