diff --git a/sale_order_priority/README.rst b/sale_order_priority/README.rst new file mode 100644 index 00000000000..6c58c24a3e1 --- /dev/null +++ b/sale_order_priority/README.rst @@ -0,0 +1,93 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +=================== +Sale Order Priority +=================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:d04b52d0444f0c976d79a12441947afb734623f4d49b7d549e2da3415809ec0c + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/18.0/sale_order_priority + :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-18-0/sale-workflow-18-0-sale_order_priority + :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=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds the field *Priority* in sale order lines and sale +orders: priority of the sale order is computed as the maximum of the +priorities of its lines, setting the priority in the order sets the +priority of all its lines accordingly. + +When a picking is created as a result of sale order confirmation, the +created procurement inherits the priority of the order, then the stock +moves and the picking inherit the procurement's priority. + +**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 +------- + +* Agile Business Group + +Contributors +------------ + +- Simone Rubino +- George Daramouskas +- ``360ERP ``: + + - Andrea Stirpe + +- Alejandro Parrales + +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_priority/__init__.py b/sale_order_priority/__init__.py new file mode 100644 index 00000000000..31660d6a965 --- /dev/null +++ b/sale_order_priority/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/sale_order_priority/__manifest__.py b/sale_order_priority/__manifest__.py new file mode 100644 index 00000000000..535a29a40c2 --- /dev/null +++ b/sale_order_priority/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2018 Simone Rubino - Agile Business Group +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Sale Order Priority", + "summary": "Define priority on sale orders", + "version": "19.0.1.0.0", + "category": "Sale Workflow", + "website": "https://github.com/OCA/sale-workflow", + "author": "Agile Business Group, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["sale_stock"], + "data": ["views/sale.xml"], +} diff --git a/sale_order_priority/i18n/es.po b/sale_order_priority/i18n/es.po new file mode 100644 index 00000000000..e3202ecee82 --- /dev/null +++ b/sale_order_priority/i18n/es.po @@ -0,0 +1,59 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_order_priority +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-07-24 21:09+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\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 4.17\n" + +#. module: sale_order_priority +#: model:ir.model.fields.selection,name:sale_order_priority.selection__sale_order__priority__0 +#: model:ir.model.fields.selection,name:sale_order_priority.selection__sale_order_line__priority__0 +msgid "Normal" +msgstr "Normal" + +#. module: sale_order_priority +#: model:ir.model.fields,field_description:sale_order_priority.field_sale_order__priority +#: model:ir.model.fields,field_description:sale_order_priority.field_sale_order_line__priority +msgid "Priority" +msgstr "Prioridad" + +#. module: sale_order_priority +#: model:ir.model.fields,help:sale_order_priority.field_sale_order__priority +msgid "" +"Priority for this sale order. Setting manually a value here would set it as " +"priority for all the order lines" +msgstr "" +"Prioridad para esta orden de venta. Establecer manualmente un valor aquí lo " +"establecería como prioridad para todas las líneas de pedido" + +#. module: sale_order_priority +#: model:ir.model,name:sale_order_priority.model_sale_order +msgid "Sales Order" +msgstr "Orden de Venta" + +#. module: sale_order_priority +#: model:ir.model,name:sale_order_priority.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línea de Orden de Venta" + +#. module: sale_order_priority +#: model:ir.model,name:sale_order_priority.model_stock_picking +msgid "Transfer" +msgstr "Transferencia" + +#. module: sale_order_priority +#: model:ir.model.fields.selection,name:sale_order_priority.selection__sale_order__priority__1 +#: model:ir.model.fields.selection,name:sale_order_priority.selection__sale_order_line__priority__1 +msgid "Urgent" +msgstr "Urgente" diff --git a/sale_order_priority/i18n/it.po b/sale_order_priority/i18n/it.po new file mode 100644 index 00000000000..8567ba3b390 --- /dev/null +++ b/sale_order_priority/i18n/it.po @@ -0,0 +1,66 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_order_priority +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-06-06 10:42+0000\n" +"PO-Revision-Date: 2024-07-22 07:58+0000\n" +"Last-Translator: mymage \n" +"Language-Team: \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_order_priority +#: model:ir.model.fields.selection,name:sale_order_priority.selection__sale_order__priority__0 +#: model:ir.model.fields.selection,name:sale_order_priority.selection__sale_order_line__priority__0 +msgid "Normal" +msgstr "Normale" + +#. module: sale_order_priority +#: model:ir.model.fields,field_description:sale_order_priority.field_sale_order__priority +#: model:ir.model.fields,field_description:sale_order_priority.field_sale_order_line__priority +msgid "Priority" +msgstr "Priorità" + +#. module: sale_order_priority +#: model:ir.model.fields,help:sale_order_priority.field_sale_order__priority +msgid "" +"Priority for this sale order. Setting manually a value here would set it as " +"priority for all the order lines" +msgstr "" +"Priorità di questo ordine di vendita. Impostando qui un valore, verrà " +"impostato anche in tutte le righe" + +#. module: sale_order_priority +#: model:ir.model,name:sale_order_priority.model_sale_order +msgid "Sales Order" +msgstr "Ordine di vendita" + +#. module: sale_order_priority +#: model:ir.model,name:sale_order_priority.model_sale_order_line +msgid "Sales Order Line" +msgstr "Riga ordine di vendita" + +#. module: sale_order_priority +#: model:ir.model,name:sale_order_priority.model_stock_picking +msgid "Transfer" +msgstr "Trasferimento" + +#. module: sale_order_priority +#: model:ir.model.fields.selection,name:sale_order_priority.selection__sale_order__priority__1 +#: model:ir.model.fields.selection,name:sale_order_priority.selection__sale_order_line__priority__1 +msgid "Urgent" +msgstr "Urgente" + +#~ msgid "Not urgent" +#~ msgstr "Non urgente" + +#~ msgid "Very Urgent" +#~ msgstr "Molto urgente" diff --git a/sale_order_priority/i18n/sale_order_priority.pot b/sale_order_priority/i18n/sale_order_priority.pot new file mode 100644 index 00000000000..029640b396d --- /dev/null +++ b/sale_order_priority/i18n/sale_order_priority.pot @@ -0,0 +1,54 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_order_priority +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.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_priority +#: model:ir.model.fields.selection,name:sale_order_priority.selection__sale_order__priority__0 +#: model:ir.model.fields.selection,name:sale_order_priority.selection__sale_order_line__priority__0 +msgid "Normal" +msgstr "" + +#. module: sale_order_priority +#: model:ir.model.fields,field_description:sale_order_priority.field_sale_order__priority +#: model:ir.model.fields,field_description:sale_order_priority.field_sale_order_line__priority +msgid "Priority" +msgstr "" + +#. module: sale_order_priority +#: model:ir.model.fields,help:sale_order_priority.field_sale_order__priority +msgid "" +"Priority for this sale order. Setting manually a value here would set it as " +"priority for all the order lines" +msgstr "" + +#. module: sale_order_priority +#: model:ir.model,name:sale_order_priority.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: sale_order_priority +#: model:ir.model,name:sale_order_priority.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + +#. module: sale_order_priority +#: model:ir.model,name:sale_order_priority.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: sale_order_priority +#: model:ir.model.fields.selection,name:sale_order_priority.selection__sale_order__priority__1 +#: model:ir.model.fields.selection,name:sale_order_priority.selection__sale_order_line__priority__1 +msgid "Urgent" +msgstr "" diff --git a/sale_order_priority/models/__init__.py b/sale_order_priority/models/__init__.py new file mode 100644 index 00000000000..0e346967964 --- /dev/null +++ b/sale_order_priority/models/__init__.py @@ -0,0 +1,5 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import sale_order +from . import sale_order_line +from . import stock_move diff --git a/sale_order_priority/models/sale_order.py b/sale_order_priority/models/sale_order.py new file mode 100644 index 00000000000..4e4ea5b8466 --- /dev/null +++ b/sale_order_priority/models/sale_order.py @@ -0,0 +1,36 @@ +# Copyright 2018 Simone Rubino - Agile Business Group +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + +from odoo.addons.stock.models import stock_move + + +class SaleOrder(models.Model): + _inherit = "sale.order" + + priority = fields.Selection( + stock_move.PROCUREMENT_PRIORITIES, + compute="_compute_priority", + inverse="_inverse_priority", + store=True, + index=True, + tracking=True, + help="Priority for this sale order. " + "Setting manually a value here would set it as priority " + "for all the order lines", + ) + + @api.depends("order_line.priority") + def _compute_priority(self): + for order in self.filtered(lambda x: x.order_line): + priority = order.mapped("order_line.priority") + order.priority = max([x for x in priority if x] or "0") + + def _inverse_priority(self): + for order in self: + priority = order.priority + for line in order.order_line.filtered( + lambda x, pr=priority: x.priority != pr + ): + line.priority = priority diff --git a/sale_order_priority/models/sale_order_line.py b/sale_order_priority/models/sale_order_line.py new file mode 100644 index 00000000000..07cc0bdb13f --- /dev/null +++ b/sale_order_priority/models/sale_order_line.py @@ -0,0 +1,12 @@ +# Copyright 2018 Simone Rubino - Agile Business Group +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + +from odoo.addons.stock.models import stock_move + + +class SaleOrderLine(models.Model): + _inherit = "sale.order.line" + + priority = fields.Selection(stock_move.PROCUREMENT_PRIORITIES, default="0") diff --git a/sale_order_priority/models/stock_move.py b/sale_order_priority/models/stock_move.py new file mode 100644 index 00000000000..493f6f5ef4a --- /dev/null +++ b/sale_order_priority/models/stock_move.py @@ -0,0 +1,11 @@ +from odoo import models + + +class StockMove(models.Model): + _inherit = "stock.move" + + def _get_new_picking_values(self): + picking_values = super()._get_new_picking_values() + if self.reference_ids.sale_ids.priority: + picking_values["priority"] = self.reference_ids.sale_ids.priority + return picking_values diff --git a/sale_order_priority/pyproject.toml b/sale_order_priority/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/sale_order_priority/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/sale_order_priority/readme/CONTRIBUTORS.md b/sale_order_priority/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..ad6b3a5c592 --- /dev/null +++ b/sale_order_priority/readme/CONTRIBUTORS.md @@ -0,0 +1,5 @@ +- Simone Rubino \<\> +- George Daramouskas \<\> +- `360ERP `: + - Andrea Stirpe +- Alejandro Parrales \<\> diff --git a/sale_order_priority/readme/DESCRIPTION.md b/sale_order_priority/readme/DESCRIPTION.md new file mode 100644 index 00000000000..adab087d44f --- /dev/null +++ b/sale_order_priority/readme/DESCRIPTION.md @@ -0,0 +1,8 @@ +This module adds the field *Priority* in sale order lines and sale +orders: priority of the sale order is computed as the maximum of the +priorities of its lines, setting the priority in the order sets the +priority of all its lines accordingly. + +When a picking is created as a result of sale order confirmation, the +created procurement inherits the priority of the order, then the stock +moves and the picking inherit the procurement's priority. diff --git a/sale_order_priority/static/description/icon.png b/sale_order_priority/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/sale_order_priority/static/description/icon.png differ diff --git a/sale_order_priority/static/description/index.html b/sale_order_priority/static/description/index.html new file mode 100644 index 00000000000..df8cb35c137 --- /dev/null +++ b/sale_order_priority/static/description/index.html @@ -0,0 +1,441 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Sale Order Priority

+ +

Beta License: AGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runboat

+

This module adds the field Priority in sale order lines and sale +orders: priority of the sale order is computed as the maximum of the +priorities of its lines, setting the priority in the order sets the +priority of all its lines accordingly.

+

When a picking is created as a result of sale order confirmation, the +created procurement inherits the priority of the order, then the stock +moves and the picking inherit the procurement’s priority.

+

Table of contents

+ +
+

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

+
    +
  • Agile Business Group
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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_priority/tests/__init__.py b/sale_order_priority/tests/__init__.py new file mode 100644 index 00000000000..6fc5e07fb36 --- /dev/null +++ b/sale_order_priority/tests/__init__.py @@ -0,0 +1,3 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_sale_stock diff --git a/sale_order_priority/tests/test_sale_stock.py b/sale_order_priority/tests/test_sale_stock.py new file mode 100644 index 00000000000..5811bfc0c88 --- /dev/null +++ b/sale_order_priority/tests/test_sale_stock.py @@ -0,0 +1,72 @@ +# Copyright 2018 Simone Rubino - Agile Business Group +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo.fields import Command + +from odoo.addons.sale.tests.common import TestSaleCommon + + +class TestSaleStock(TestSaleCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.company = cls.env["res.company"].create( + { + "name": "Test Company", + "currency_id": cls.env.ref("base.EUR").id, + } + ) + + cls.company_data = cls.collect_company_accounting_data(cls.company) + + cls.partner = cls.env["res.partner"].create( + { + "name": "partner1", + "company_id": False, + } + ) + + def test_sale_order_priority(self): + sale_order_priority = "1" + self.sale_order = self.env["sale.order"].create( + { + "partner_id": self.partner.id, + "priority": sale_order_priority, + "company_id": self.company.id, + "order_line": [ + Command.create( + { + "name": self.company_data["product_order_cost"].name, + "product_id": self.company_data["product_order_cost"].id, + "product_uom_qty": 2, + "qty_delivered": 1, + "product_uom_id": self.company_data[ + "product_order_cost" + ].uom_id.id, + "price_unit": self.company_data[ + "product_order_cost" + ].list_price, + }, + ), + ], + } + ) + sale_order_line_priority = "0" + for sol in self.sale_order.order_line: + # Test that the order's priority has been + # correctly assigned to the order lines + self.assertEqual( + sol.priority, + sale_order_priority, + "Priority of order lines does not match", + ) + sol.priority = sale_order_line_priority + # Confirm the order and check the picking + self.sale_order.action_confirm() + # Test that the lines' priority has been + # correctly assigned to the generated pickings + self.assertEqual( + max(self.sale_order.picking_ids.mapped("priority")), + sale_order_line_priority, + "Priority of generated picking does not match", + ) diff --git a/sale_order_priority/views/sale.xml b/sale_order_priority/views/sale.xml new file mode 100644 index 00000000000..bea68d0a995 --- /dev/null +++ b/sale_order_priority/views/sale.xml @@ -0,0 +1,28 @@ + + + + + Sale order priority + sale.order + + + + + + + + + + + + + + +