From 6cd8f751df742ef5601658487d301e6288d1020f Mon Sep 17 00:00:00 2001 From: root Date: Thu, 27 Feb 2025 15:13:16 +0000 Subject: [PATCH 1/6] [18.0][MIG] purchase_packaging_default: Migration to 18.0 --- purchase_packaging_default/README.rst | 78 ++++ purchase_packaging_default/__init__.py | 1 + purchase_packaging_default/__manifest__.py | 20 + purchase_packaging_default/i18n/it.po | 60 +++ .../i18n/purchase_packaging_default.pot | 53 +++ purchase_packaging_default/models/__init__.py | 4 + .../models/product_packaging.py | 14 + .../models/purchase_order_line.py | 45 ++ .../models/res_company.py | 13 + .../models/res_config_settings.py | 13 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 422 ++++++++++++++++++ purchase_packaging_default/tests/__init__.py | 1 + .../tests/test_purchase_packaging_default.py | 41 ++ .../views/res_config_settings_views.xml | 30 ++ 17 files changed, 799 insertions(+) create mode 100644 purchase_packaging_default/README.rst create mode 100644 purchase_packaging_default/__init__.py create mode 100644 purchase_packaging_default/__manifest__.py create mode 100644 purchase_packaging_default/i18n/it.po create mode 100644 purchase_packaging_default/i18n/purchase_packaging_default.pot create mode 100644 purchase_packaging_default/models/__init__.py create mode 100644 purchase_packaging_default/models/product_packaging.py create mode 100644 purchase_packaging_default/models/purchase_order_line.py create mode 100644 purchase_packaging_default/models/res_company.py create mode 100644 purchase_packaging_default/models/res_config_settings.py create mode 100644 purchase_packaging_default/readme/CONTRIBUTORS.rst create mode 100644 purchase_packaging_default/readme/DESCRIPTION.rst create mode 100644 purchase_packaging_default/static/description/icon.png create mode 100644 purchase_packaging_default/static/description/index.html create mode 100644 purchase_packaging_default/tests/__init__.py create mode 100644 purchase_packaging_default/tests/test_purchase_packaging_default.py create mode 100644 purchase_packaging_default/views/res_config_settings_views.xml diff --git a/purchase_packaging_default/README.rst b/purchase_packaging_default/README.rst new file mode 100644 index 00000000000..18b07581095 --- /dev/null +++ b/purchase_packaging_default/README.rst @@ -0,0 +1,78 @@ +========================== +Purchase Packaging Default +========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:f4adb77568893160d1479fbd3bd29a4d4a0b95d247128176778bd0bbbd815844 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/licence-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%2Fpurchase--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/purchase-workflow/tree/16.0/purchase_packaging_default + :alt: OCA/purchase-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_packaging_default + :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/purchase-workflow&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Allows you to set a default packaging on the order line using the first packaging defined in the configuration of the respective product +Default packaging quantity is then set based on purchase order line quantity divided by product packaging quantity. +Packaging quantity is rounded up as we sell it by units. For example: We won't sell 0.5 Boxes or 1.5 Pallets. + +**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 +~~~~~~~ + +* Camptocamp + +Contributors +~~~~~~~~~~~~ + +* Telmo Santos + +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/purchase-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/purchase_packaging_default/__init__.py b/purchase_packaging_default/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/purchase_packaging_default/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/purchase_packaging_default/__manifest__.py b/purchase_packaging_default/__manifest__.py new file mode 100644 index 00000000000..91b2f386013 --- /dev/null +++ b/purchase_packaging_default/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2024 Camptocamp (). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Purchase Packaging Default", + "version": "18.0.1.0.0", + "development_status": "Beta", + "category": "Purchase Management", + "summary": "Set default packaging in purchase", + "author": "Camptocamp, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/purchase-workflow", + "license": "AGPL-3", + "depends": [ + "purchase", + ], + "data": [ + "views/res_config_settings_views.xml", + ], + "installable": True, +} diff --git a/purchase_packaging_default/i18n/it.po b/purchase_packaging_default/i18n/it.po new file mode 100644 index 00000000000..9a6433d3de2 --- /dev/null +++ b/purchase_packaging_default/i18n/it.po @@ -0,0 +1,60 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_packaging_default +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-05-15 09:34+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 4.17\n" + +#. module: purchase_packaging_default +#: model_terms:ir.ui.view,arch_db:purchase_packaging_default.res_config_settings_view_form_purchase +msgid "" +"Assign the first packaging found in product configuration to purchase order" +msgstr "" +"Assegna il primo imballo trovato nella configurazione prodotto all'ordine di " +"acquisto" + +#. module: purchase_packaging_default +#: model:ir.model,name:purchase_packaging_default.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: purchase_packaging_default +#: model:ir.model.fields,help:purchase_packaging_default.field_res_company__purchase_packaging_default_enabled +#: model:ir.model.fields,help:purchase_packaging_default.field_res_config_settings__purchase_packaging_default_enabled +msgid "" +"In purchase order line get 1st packaging found in product configuration" +msgstr "" +"Nella riga ordine di acquisto prendere il primo imballaggio trovato nella " +"configurazione prodotto" + +#. module: purchase_packaging_default +#: model:ir.model,name:purchase_packaging_default.model_res_config_settings +msgid "Procurement purchase grouping settings" +msgstr "Impostazioni raggruppamento approvvigionamento acquisti" + +#. module: purchase_packaging_default +#: model:ir.model,name:purchase_packaging_default.model_product_packaging +msgid "Product Packaging" +msgstr "Imballaggio prodotto" + +#. module: purchase_packaging_default +#: model:ir.model,name:purchase_packaging_default.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "Riga ordine di acquisto" + +#. module: purchase_packaging_default +#: model:ir.model.fields,field_description:purchase_packaging_default.field_res_company__purchase_packaging_default_enabled +#: model:ir.model.fields,field_description:purchase_packaging_default.field_res_config_settings__purchase_packaging_default_enabled +msgid "Purchase Packaging Default Enabled" +msgstr "Imballaggio di acquisto predefinito abilitato" diff --git a/purchase_packaging_default/i18n/purchase_packaging_default.pot b/purchase_packaging_default/i18n/purchase_packaging_default.pot new file mode 100644 index 00000000000..a7497de2e1e --- /dev/null +++ b/purchase_packaging_default/i18n/purchase_packaging_default.pot @@ -0,0 +1,53 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_packaging_default +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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: purchase_packaging_default +#: model_terms:ir.ui.view,arch_db:purchase_packaging_default.res_config_settings_view_form_purchase +msgid "" +"Assign the first packaging found in product configuration to purchase order" +msgstr "" + +#. module: purchase_packaging_default +#: model:ir.model,name:purchase_packaging_default.model_res_company +msgid "Companies" +msgstr "" + +#. module: purchase_packaging_default +#: model:ir.model.fields,help:purchase_packaging_default.field_res_company__purchase_packaging_default_enabled +#: model:ir.model.fields,help:purchase_packaging_default.field_res_config_settings__purchase_packaging_default_enabled +msgid "" +"In purchase order line get 1st packaging found in product configuration" +msgstr "" + +#. module: purchase_packaging_default +#: model:ir.model,name:purchase_packaging_default.model_res_config_settings +msgid "Procurement purchase grouping settings" +msgstr "" + +#. module: purchase_packaging_default +#: model:ir.model,name:purchase_packaging_default.model_product_packaging +msgid "Product Packaging" +msgstr "" + +#. module: purchase_packaging_default +#: model:ir.model,name:purchase_packaging_default.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_packaging_default +#: model:ir.model.fields,field_description:purchase_packaging_default.field_res_company__purchase_packaging_default_enabled +#: model:ir.model.fields,field_description:purchase_packaging_default.field_res_config_settings__purchase_packaging_default_enabled +msgid "Purchase Packaging Default Enabled" +msgstr "" diff --git a/purchase_packaging_default/models/__init__.py b/purchase_packaging_default/models/__init__.py new file mode 100644 index 00000000000..c25a446120d --- /dev/null +++ b/purchase_packaging_default/models/__init__.py @@ -0,0 +1,4 @@ +from . import purchase_order_line +from . import product_packaging +from . import res_company +from . import res_config_settings diff --git a/purchase_packaging_default/models/product_packaging.py b/purchase_packaging_default/models/product_packaging.py new file mode 100644 index 00000000000..a59a5442847 --- /dev/null +++ b/purchase_packaging_default/models/product_packaging.py @@ -0,0 +1,14 @@ +# Copyright 2025 Camptocamp (). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models + + +class ProductPackaging(models.Model): + _inherit = "product.packaging" + + def _find_suitable_product_packaging(self, product_qty, uom_id): + """Find nothing if you want to keep what was there.""" + if self.env.context.get("keep_product_packaging"): + return self.browse() + return super()._find_suitable_product_packaging(product_qty, uom_id) diff --git a/purchase_packaging_default/models/purchase_order_line.py b/purchase_packaging_default/models/purchase_order_line.py new file mode 100644 index 00000000000..9b7a63c4f49 --- /dev/null +++ b/purchase_packaging_default/models/purchase_order_line.py @@ -0,0 +1,45 @@ +# Copyright 2025 Camptocamp (). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import math + +from odoo import api, fields, models + + +class PurchaseOrderLine(models.Model): + _inherit = "purchase.order.line" + + def _get_default_packaging(self): + """From product get 1st packaging found ordered by sequence""" + product_template = self.product_id.product_tmpl_id + return fields.first(product_template.packaging_ids) + + @api.onchange("product_id") + def _onchange_product_id(self): + if self.company_id.purchase_packaging_default_enabled: + product_packaging = self._get_default_packaging() + if product_packaging: + self.product_packaging_id = product_packaging + + @api.depends("product_id", "product_qty", "product_uom") + def _compute_product_packaging_id(self): + _self = self + if self.company_id.purchase_packaging_default_enabled: + _self = _self.with_context(keep_product_packaging=True) + return super(PurchaseOrderLine, _self)._compute_product_packaging_id() + + @api.depends("product_packaging_id", "product_uom", "product_qty") + def _compute_product_packaging_qty(self): + res = super()._compute_product_packaging_qty() + for line in self: + if line.product_packaging_qty: + packaging_uom = line.product_packaging_id.product_uom_id + packaging_uom_qty = line.product_uom._compute_quantity( + line.product_qty, packaging_uom + ) + # Super computes product_packaging_qty rounding it to packaging_uom.precision. + # We must round up that value as we won't sell 0.5, 1.6 boxes/pallets + line.product_packaging_qty = math.ceil( + packaging_uom_qty / line.product_packaging_id.qty + ) + return res diff --git a/purchase_packaging_default/models/res_company.py b/purchase_packaging_default/models/res_company.py new file mode 100644 index 00000000000..b710377a9d9 --- /dev/null +++ b/purchase_packaging_default/models/res_company.py @@ -0,0 +1,13 @@ +# Copyright 2025 Camptocamp (). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + purchase_packaging_default_enabled = fields.Boolean( + help="In purchase order line get 1st packaging found in product configuration", + ) diff --git a/purchase_packaging_default/models/res_config_settings.py b/purchase_packaging_default/models/res_config_settings.py new file mode 100644 index 00000000000..256453eb815 --- /dev/null +++ b/purchase_packaging_default/models/res_config_settings.py @@ -0,0 +1,13 @@ +# Copyright 2025 Camptocamp (). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + purchase_packaging_default_enabled = fields.Boolean( + related="company_id.purchase_packaging_default_enabled", + readonly=False, + ) diff --git a/purchase_packaging_default/readme/CONTRIBUTORS.rst b/purchase_packaging_default/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..8ed3aebaca0 --- /dev/null +++ b/purchase_packaging_default/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Telmo Santos diff --git a/purchase_packaging_default/readme/DESCRIPTION.rst b/purchase_packaging_default/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..d478b9c8da2 --- /dev/null +++ b/purchase_packaging_default/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +Allows you to set a default packaging on the order line using the first packaging defined in the configuration of the respective product +Default packaging quantity is then set based on purchase order line quantity divided by product packaging quantity. +Packaging quantity is rounded up as we sell it by units. For example: We won't sell 0.5 Boxes or 1.5 Pallets. \ No newline at end of file diff --git a/purchase_packaging_default/static/description/icon.png b/purchase_packaging_default/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/purchase_packaging_default/static/description/index.html b/purchase_packaging_default/static/description/index.html new file mode 100644 index 00000000000..08392bf2e8d --- /dev/null +++ b/purchase_packaging_default/static/description/index.html @@ -0,0 +1,422 @@ + + + + + +Purchase Packaging Default + + + +
+

Purchase Packaging Default

+ + +

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

+

Allows you to set a default packaging on the order line using the first packaging defined in the configuration of the respective product +Default packaging quantity is then set based on purchase order line quantity divided by product packaging quantity. +Packaging quantity is rounded up as we sell it by units. For example: We won’t sell 0.5 Boxes or 1.5 Pallets.

+

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

+
    +
  • Camptocamp
  • +
+
+ +
+

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/purchase-workflow project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/purchase_packaging_default/tests/__init__.py b/purchase_packaging_default/tests/__init__.py new file mode 100644 index 00000000000..e9bc0933dd6 --- /dev/null +++ b/purchase_packaging_default/tests/__init__.py @@ -0,0 +1 @@ +from . import test_purchase_packaging_default diff --git a/purchase_packaging_default/tests/test_purchase_packaging_default.py b/purchase_packaging_default/tests/test_purchase_packaging_default.py new file mode 100644 index 00000000000..591bfb619b4 --- /dev/null +++ b/purchase_packaging_default/tests/test_purchase_packaging_default.py @@ -0,0 +1,41 @@ +# Copyright 2024 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo.tests.common import Form + +from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT +from odoo.addons.product.tests.common import ProductCommon + + +class PurchasePackagingDefault(ProductCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env.user.groups_id |= cls.env.ref("product.group_stock_packaging") + cls.env = cls.env["base"].with_context(**DISABLED_MAIL_CONTEXT).env + cls.config = cls.env["res.config.settings"].create({}) + cls.config.purchase_packaging_default_enabled = True + cls.config.set_values() + with Form(cls.product) as product_f: + with product_f.packaging_ids.new() as packaging_f: + packaging_f.name = "Pallet" + packaging_f.qty = 240 + packaging_f.purchase = True + with product_f.packaging_ids.new() as packaging_f: + packaging_f.name = "Big Box" + packaging_f.qty = 24 + packaging_f.purchase = True + cls.pallet, cls.big_box = cls.product.packaging_ids + + def test_purchase_packaging_default(self): + po_f = Form(self.env["purchase.order"]) + po_f.partner_id = self.partner + with po_f.order_line.new() as line_f: + line_f.product_id = self.product + line_f.product_qty = 120 + # We take the first available packaging + self.assertEqual(line_f.product_packaging_id, self.pallet) + # Packaging qty is round up to 1 + self.assertEqual(line_f.product_packaging_qty, 1) + # Packaging qty is round up to 2 + line_f.product_qty = 241 + self.assertEqual(line_f.product_packaging_qty, 2) diff --git a/purchase_packaging_default/views/res_config_settings_views.xml b/purchase_packaging_default/views/res_config_settings_views.xml new file mode 100644 index 00000000000..24bbba8af81 --- /dev/null +++ b/purchase_packaging_default/views/res_config_settings_views.xml @@ -0,0 +1,30 @@ + + + + res.config.settings.view.form.inherit.purchase + res.config.settings + + + + +
+
+ +
+
+
+
+
+
+
+
From ca001df6a4b47edb38185e4f732da9b91815fb2d Mon Sep 17 00:00:00 2001 From: root Date: Thu, 27 Feb 2025 15:39:15 +0000 Subject: [PATCH 2/6] [18.0][MIG] purchase_packaging_default: Migration to 18.0 --- purchase_packaging_default/README.rst | 27 ++++++++++--------- .../models/purchase_order_line.py | 6 +++-- purchase_packaging_default/pyproject.toml | 3 +++ .../readme/CONTRIBUTORS.md | 1 + .../readme/CONTRIBUTORS.rst | 1 - .../readme/DESCRIPTION.md | 6 +++++ .../readme/DESCRIPTION.rst | 3 --- .../static/description/index.html | 26 +++++++++++------- 8 files changed, 45 insertions(+), 28 deletions(-) create mode 100644 purchase_packaging_default/pyproject.toml create mode 100644 purchase_packaging_default/readme/CONTRIBUTORS.md delete mode 100644 purchase_packaging_default/readme/CONTRIBUTORS.rst create mode 100644 purchase_packaging_default/readme/DESCRIPTION.md delete mode 100644 purchase_packaging_default/readme/DESCRIPTION.rst diff --git a/purchase_packaging_default/README.rst b/purchase_packaging_default/README.rst index 18b07581095..f181ad49e55 100644 --- a/purchase_packaging_default/README.rst +++ b/purchase_packaging_default/README.rst @@ -17,20 +17,23 @@ Purchase Packaging Default :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github - :target: https://github.com/OCA/purchase-workflow/tree/16.0/purchase_packaging_default + :target: https://github.com/OCA/purchase-workflow/tree/18.0/purchase_packaging_default :alt: OCA/purchase-workflow .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_packaging_default + :target: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_packaging_default :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/purchase-workflow&target_branch=16.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| -Allows you to set a default packaging on the order line using the first packaging defined in the configuration of the respective product -Default packaging quantity is then set based on purchase order line quantity divided by product packaging quantity. -Packaging quantity is rounded up as we sell it by units. For example: We won't sell 0.5 Boxes or 1.5 Pallets. +Allows you to set a default packaging on the order line using the first +packaging defined in the configuration of the respective product Default +packaging quantity is then set based on purchase order line quantity +divided by product packaging quantity. Packaging quantity is rounded up +as we sell it by units. For example: We won't sell 0.5 Boxes or 1.5 +Pallets. **Table of contents** @@ -43,7 +46,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -51,17 +54,17 @@ Credits ======= Authors -~~~~~~~ +------- * Camptocamp Contributors -~~~~~~~~~~~~ +------------ -* Telmo Santos +- Telmo Santos Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -73,6 +76,6 @@ 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/purchase-workflow `_ project on GitHub. +This module is part of the `OCA/purchase-workflow `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/purchase_packaging_default/models/purchase_order_line.py b/purchase_packaging_default/models/purchase_order_line.py index 9b7a63c4f49..184266792ef 100644 --- a/purchase_packaging_default/models/purchase_order_line.py +++ b/purchase_packaging_default/models/purchase_order_line.py @@ -37,8 +37,10 @@ def _compute_product_packaging_qty(self): packaging_uom_qty = line.product_uom._compute_quantity( line.product_qty, packaging_uom ) - # Super computes product_packaging_qty rounding it to packaging_uom.precision. - # We must round up that value as we won't sell 0.5, 1.6 boxes/pallets + # Super computes product_packaging_qty rounding it + # to packaging_uom.precision. + # We must round up that value as we won't sell 0.5, + # 1.6 boxes/pallets. line.product_packaging_qty = math.ceil( packaging_uom_qty / line.product_packaging_id.qty ) diff --git a/purchase_packaging_default/pyproject.toml b/purchase_packaging_default/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/purchase_packaging_default/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/purchase_packaging_default/readme/CONTRIBUTORS.md b/purchase_packaging_default/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..08b9f3e73d4 --- /dev/null +++ b/purchase_packaging_default/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Telmo Santos \ diff --git a/purchase_packaging_default/readme/CONTRIBUTORS.rst b/purchase_packaging_default/readme/CONTRIBUTORS.rst deleted file mode 100644 index 8ed3aebaca0..00000000000 --- a/purchase_packaging_default/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1 +0,0 @@ -* Telmo Santos diff --git a/purchase_packaging_default/readme/DESCRIPTION.md b/purchase_packaging_default/readme/DESCRIPTION.md new file mode 100644 index 00000000000..dd993d72b23 --- /dev/null +++ b/purchase_packaging_default/readme/DESCRIPTION.md @@ -0,0 +1,6 @@ +Allows you to set a default packaging on the order line using the first +packaging defined in the configuration of the respective product Default +packaging quantity is then set based on purchase order line quantity +divided by product packaging quantity. Packaging quantity is rounded up +as we sell it by units. For example: We won't sell 0.5 Boxes or 1.5 +Pallets. diff --git a/purchase_packaging_default/readme/DESCRIPTION.rst b/purchase_packaging_default/readme/DESCRIPTION.rst deleted file mode 100644 index d478b9c8da2..00000000000 --- a/purchase_packaging_default/readme/DESCRIPTION.rst +++ /dev/null @@ -1,3 +0,0 @@ -Allows you to set a default packaging on the order line using the first packaging defined in the configuration of the respective product -Default packaging quantity is then set based on purchase order line quantity divided by product packaging quantity. -Packaging quantity is rounded up as we sell it by units. For example: We won't sell 0.5 Boxes or 1.5 Pallets. \ No newline at end of file diff --git a/purchase_packaging_default/static/description/index.html b/purchase_packaging_default/static/description/index.html index 08392bf2e8d..b35ba20b8d8 100644 --- a/purchase_packaging_default/static/description/index.html +++ b/purchase_packaging_default/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -368,10 +369,13 @@

Purchase Packaging Default

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:f4adb77568893160d1479fbd3bd29a4d4a0b95d247128176778bd0bbbd815844 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

-

Allows you to set a default packaging on the order line using the first packaging defined in the configuration of the respective product -Default packaging quantity is then set based on purchase order line quantity divided by product packaging quantity. -Packaging quantity is rounded up as we sell it by units. For example: We won’t sell 0.5 Boxes or 1.5 Pallets.

+

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

+

Allows you to set a default packaging on the order line using the first +packaging defined in the configuration of the respective product Default +packaging quantity is then set based on purchase order line quantity +divided by product packaging quantity. Packaging quantity is rounded up +as we sell it by units. For example: We won’t sell 0.5 Boxes or 1.5 +Pallets.

Table of contents

    @@ -389,7 +393,7 @@

    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.

    +feedback.

    Do not contact contributors directly about support or help with technical issues.

@@ -409,11 +413,13 @@

Contributors

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +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/purchase-workflow project on GitHub.

+

This module is part of the OCA/purchase-workflow project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

From 4c7a91102b6b68fa33647510b78f77b3f88e1516 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 27 Feb 2025 17:03:32 +0000 Subject: [PATCH 3/6] [18.0][MIG] fix after test result: Migration to 18.0 --- purchase_packaging_default/models/purchase_order_line.py | 4 +++- .../tests/test_purchase_packaging_default.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/purchase_packaging_default/models/purchase_order_line.py b/purchase_packaging_default/models/purchase_order_line.py index 184266792ef..f2ee9bae873 100644 --- a/purchase_packaging_default/models/purchase_order_line.py +++ b/purchase_packaging_default/models/purchase_order_line.py @@ -15,11 +15,13 @@ def _get_default_packaging(self): return fields.first(product_template.packaging_ids) @api.onchange("product_id") - def _onchange_product_id(self): + def onchange_product_id(self): + super().onchange_product_id() if self.company_id.purchase_packaging_default_enabled: product_packaging = self._get_default_packaging() if product_packaging: self.product_packaging_id = product_packaging + self.product_packaging_qty = 1 @api.depends("product_id", "product_qty", "product_uom") def _compute_product_packaging_id(self): diff --git a/purchase_packaging_default/tests/test_purchase_packaging_default.py b/purchase_packaging_default/tests/test_purchase_packaging_default.py index 591bfb619b4..6f5827fd7b5 100644 --- a/purchase_packaging_default/tests/test_purchase_packaging_default.py +++ b/purchase_packaging_default/tests/test_purchase_packaging_default.py @@ -1,4 +1,4 @@ -# Copyright 2024 Camptocamp SA +# Copyright 2025 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo.tests.common import Form From c948511e31a4da8134342e8f9bebfd012bae77e4 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 27 Feb 2025 17:06:25 +0000 Subject: [PATCH 4/6] [18.0][MIG] fix after test result: Migration to 18.0 --- purchase_packaging_default/models/purchase_order_line.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/purchase_packaging_default/models/purchase_order_line.py b/purchase_packaging_default/models/purchase_order_line.py index f2ee9bae873..5e7325707fd 100644 --- a/purchase_packaging_default/models/purchase_order_line.py +++ b/purchase_packaging_default/models/purchase_order_line.py @@ -16,12 +16,13 @@ def _get_default_packaging(self): @api.onchange("product_id") def onchange_product_id(self): - super().onchange_product_id() + res = super().onchange_product_id() if self.company_id.purchase_packaging_default_enabled: product_packaging = self._get_default_packaging() if product_packaging: self.product_packaging_id = product_packaging self.product_packaging_qty = 1 + return res @api.depends("product_id", "product_qty", "product_uom") def _compute_product_packaging_id(self): From ff2a31990aa3b965239165f1d9ae31cafbb97630 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 27 Feb 2025 17:18:40 +0000 Subject: [PATCH 5/6] [18.0][MIG] fix: Migration to 18.0 --- .../tests/test_purchase_packaging_default.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/purchase_packaging_default/tests/test_purchase_packaging_default.py b/purchase_packaging_default/tests/test_purchase_packaging_default.py index 6f5827fd7b5..482a3f3a61a 100644 --- a/purchase_packaging_default/tests/test_purchase_packaging_default.py +++ b/purchase_packaging_default/tests/test_purchase_packaging_default.py @@ -1,7 +1,6 @@ # Copyright 2025 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo.tests.common import Form - +from odoo.tests import Form from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT from odoo.addons.product.tests.common import ProductCommon From c92dd2abdcf52b51e2c54a472536d20817ae75e0 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 27 Feb 2025 17:23:37 +0000 Subject: [PATCH 6/6] [18.0][MIG] fix: Migration to 18.0 --- .../tests/test_purchase_packaging_default.py | 1 + 1 file changed, 1 insertion(+) diff --git a/purchase_packaging_default/tests/test_purchase_packaging_default.py b/purchase_packaging_default/tests/test_purchase_packaging_default.py index 482a3f3a61a..27d6f8f6590 100644 --- a/purchase_packaging_default/tests/test_purchase_packaging_default.py +++ b/purchase_packaging_default/tests/test_purchase_packaging_default.py @@ -1,6 +1,7 @@ # Copyright 2025 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo.tests import Form + from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT from odoo.addons.product.tests.common import ProductCommon