From 305906e463ecf36c7ecce401cc4d51f605896a1d Mon Sep 17 00:00:00 2001 From: David Date: Mon, 9 Sep 2024 13:00:32 +0200 Subject: [PATCH 01/11] [ADD] product_catalog_stock: New module Use the product catalgo with pickings TT50477 [UPD] Update product_catalog_stock.pot [BOT] post-merge updates --- product_catalog_stock/README.rst | 94 ++++ product_catalog_stock/__init__.py | 1 + product_catalog_stock/__manifest__.py | 16 + .../i18n/product_catalog_stock.pot | 51 ++ product_catalog_stock/models/__init__.py | 2 + product_catalog_stock/models/stock_picking.py | 152 ++++++ .../models/stock_picking_type.py | 24 + product_catalog_stock/readme/CONTRIBUTORS.md | 2 + product_catalog_stock/readme/DESCRIPTION.md | 1 + product_catalog_stock/readme/ROADMAP.md | 2 + product_catalog_stock/readme/USAGE.md | 5 + .../static/description/icon.png | Bin 0 -> 10254 bytes .../static/description/index.html | 445 ++++++++++++++++++ .../views/stock_picking_type_views.xml | 17 + .../views/stock_picking_views.xml | 19 + 15 files changed, 831 insertions(+) create mode 100644 product_catalog_stock/README.rst create mode 100644 product_catalog_stock/__init__.py create mode 100644 product_catalog_stock/__manifest__.py create mode 100644 product_catalog_stock/i18n/product_catalog_stock.pot create mode 100644 product_catalog_stock/models/__init__.py create mode 100644 product_catalog_stock/models/stock_picking.py create mode 100644 product_catalog_stock/models/stock_picking_type.py create mode 100644 product_catalog_stock/readme/CONTRIBUTORS.md create mode 100644 product_catalog_stock/readme/DESCRIPTION.md create mode 100644 product_catalog_stock/readme/ROADMAP.md create mode 100644 product_catalog_stock/readme/USAGE.md create mode 100644 product_catalog_stock/static/description/icon.png create mode 100644 product_catalog_stock/static/description/index.html create mode 100644 product_catalog_stock/views/stock_picking_type_views.xml create mode 100644 product_catalog_stock/views/stock_picking_views.xml diff --git a/product_catalog_stock/README.rst b/product_catalog_stock/README.rst new file mode 100644 index 00000000000..616a687d43c --- /dev/null +++ b/product_catalog_stock/README.rst @@ -0,0 +1,94 @@ +===================== +Stock Product Catalog +===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:81951bf911839ba03bb70ce4946072f00d67c64a25729b5a21aec077be5dce1f + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fproduct--attribute-lightgray.png?logo=github + :target: https://github.com/OCA/product-attribute/tree/16.0/product_catalog_stock + :alt: OCA/product-attribute +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/product-attribute-16-0/product-attribute-16-0-product_catalog_stock + :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/product-attribute&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Implementation of the product catalog for stock pickings. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To access the catalog from a stock picking. + +1. Create a new draft picking. +2. Click on the product catalog smart button. +3. Click it and start adding products to the picking. + +Known issues / Roadmap +====================== + +- In v17 the product catalog has the price key as mandatory. So maybe + further adaptations will be needed to support more models. + +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 +------- + +* Odoo SA +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__ + + - David Vidal + +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/product-attribute `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/product_catalog_stock/__init__.py b/product_catalog_stock/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/product_catalog_stock/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/product_catalog_stock/__manifest__.py b/product_catalog_stock/__manifest__.py new file mode 100644 index 00000000000..ab9c871bae9 --- /dev/null +++ b/product_catalog_stock/__manifest__.py @@ -0,0 +1,16 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +{ + "name": "Stock Product Catalog", + "summary": "Use the product catalog on stock pickings", + "version": "16.0.1.0.0", + "author": "Odoo SA, Tecnativa, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/product-attribute", + "license": "AGPL-3", + "category": "Product", + "depends": ["stock", "product_catalog"], + "data": [ + "views/stock_picking_views.xml", + "views/stock_picking_type_views.xml", + ], +} diff --git a/product_catalog_stock/i18n/product_catalog_stock.pot b/product_catalog_stock/i18n/product_catalog_stock.pot new file mode 100644 index 00000000000..189d71b0eec --- /dev/null +++ b/product_catalog_stock/i18n/product_catalog_stock.pot @@ -0,0 +1,51 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_catalog_stock +# +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: product_catalog_stock +#. odoo-python +#: code:addons/product_catalog_stock/models/stock_picking.py:0 +#, python-format +msgid "Back to picking" +msgstr "" + +#. module: product_catalog_stock +#: model_terms:ir.ui.view,arch_db:product_catalog_stock.view_picking_form +msgid "Catalog" +msgstr "" + +#. module: product_catalog_stock +#: model:ir.model.fields,field_description:product_catalog_stock.field_stock_picking__catalog_button_text +msgid "Catalog Button Text" +msgstr "" + +#. module: product_catalog_stock +#: model:ir.model,name:product_catalog_stock.model_stock_picking_type +msgid "Picking Type" +msgstr "" + +#. module: product_catalog_stock +#: model_terms:ir.ui.view,arch_db:product_catalog_stock.stock_picking_type_kanban +msgid "Planned transfer from catalog" +msgstr "" + +#. module: product_catalog_stock +#: model:ir.model,name:product_catalog_stock.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: product_catalog_stock +#: model:ir.model,name:product_catalog_stock.model_stock_picking +msgid "Transfer" +msgstr "" diff --git a/product_catalog_stock/models/__init__.py b/product_catalog_stock/models/__init__.py new file mode 100644 index 00000000000..dae0bb2efe1 --- /dev/null +++ b/product_catalog_stock/models/__init__.py @@ -0,0 +1,2 @@ +from . import stock_picking +from . import stock_picking_type diff --git a/product_catalog_stock/models/stock_picking.py b/product_catalog_stock/models/stock_picking.py new file mode 100644 index 00000000000..731611df561 --- /dev/null +++ b/product_catalog_stock/models/stock_picking.py @@ -0,0 +1,152 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from collections import defaultdict + +from odoo import _, api, models +from odoo.osv import expression + + +class StockPicking(models.Model): + _name = "stock.picking" + _inherit = ["stock.picking", "product.catalog.mixin"] + + def _compute_catalog_button_text(self): + self.catalog_button_text = _("Back to picking") + + def _get_action_add_from_catalog_extra_context(self): + return { + **super()._get_action_add_from_catalog_extra_context(), + "order_id": self.id, + } + + def _default_order_line_values(self): + default_data = super()._default_order_line_values() + new_default_data = self.env["stock.move"]._get_product_catalog_lines_data() + return {**default_data, **new_default_data} + + def _get_product_catalog_domain(self): + return expression.AND( + [ + super()._get_product_catalog_domain(), + [("type", "in", ["consu", "product"])], + ] + ) + + def _get_product_catalog_record_lines(self, product_ids): + grouped_moves = defaultdict(lambda: self.env["stock.move"]) + for move in self.move_ids: + if move.product_id.id not in product_ids: + continue + grouped_moves[move.product_id] |= move + return grouped_moves + + @api.model + def _prepare_stock_move_vals_from_catalog(self, product_id, quantity): + self.ensure_one() + product_id = self.env["product.product"].browse(product_id) + return { + "name": product_id.display_name, + "product_id": product_id.id, + "product_uom_qty": quantity, + "product_uom": product_id.uom_id.id, + "location_id": self.location_id.id, + "location_dest_id": self.location_dest_id.id, + "picking_id": self.id, + "state": self.state, + "picking_type_id": self.picking_type_id.id, + "restrict_partner_id": self.owner_id.id, + "company_id": self.company_id.id, + "partner_id": self.partner_id.id, + # Put it at the end of the order + "sequence": ((self.move_ids and self.move_ids[-1].sequence + 1) or 10), + } + + def _update_order_line_info(self, product_id, quantity, **kwargs): + """Update stock move information for a given product or create a + new one if none exists yet. + :param int product_id: The product, as a `product.product` id. + :return: There's no price unit so we return always None show nothing is shown + :rtype: None + """ + move = self.move_ids.filtered(lambda move: move.product_id.id == product_id) + if move: + if quantity != 0: + move.product_uom_qty = quantity + elif self.state == "draft": + move.unlink() + return None + else: + move.product_uom_qty = 0 + elif quantity > 0: + move = self.env["stock.move"].create( + self._prepare_stock_move_vals_from_catalog(product_id, quantity) + ) + return None + + def _is_readonly(self): + """Return Whether the sale order is read-only or not based on the state or the + lock status. + + A sale order is considered read-only if its state is 'cancel' or if the sale + order is locked. + + :return: Whether the sale order is read-only or not. + :rtype: bool + """ + self.ensure_one() + return self.state in ["cancel", "done"] + + +class StockMove(models.Model): + _inherit = "stock.move" + + def _get_product_catalog_lines_data(self, **kwargs): + """Return information about sale order lines in `self`. + + If `self` is empty, this method returns only the default value(s) needed for + the product catalog. In this case, the quantity that equals 0. + + Otherwise, it returns a quantity and a price based on the product of the SOL(s) + and whether the product is read-only or not. + + A product is considered read-only if the picking is cancelled or done. + + Note: This method cannot be called with multiple records that have different + products linked. + + :raise odoo.exceptions.ValueError: ``len(self.product_id) != 1`` + :rtype: dict + :return: A dict with the following structure: + { + 'quantity': float, + 'readOnly': bool, + } + """ + if len(self) == 1: + res = { + "quantity": self.product_uom_qty, + "readOnly": self.picking_id.state in ["cancel", "done"], + } + return res + elif self: + self.product_id.ensure_one() + res = { + "readOnly": True, + "quantity": sum( + self.mapped( + lambda move: move.product_uom._compute_quantity( + qty=move.product_uom_qty, + to_unit=move.product_id.uom_id, + ) + ) + ), + } + return res + else: + return { + "quantity": 0, + } + + def action_add_from_catalog(self): + picking = self.env["stock.picking"].browse(self.env.context.get("order_id")) + return picking.action_add_from_catalog() diff --git a/product_catalog_stock/models/stock_picking_type.py b/product_catalog_stock/models/stock_picking_type.py new file mode 100644 index 00000000000..7c71545330a --- /dev/null +++ b/product_catalog_stock/models/stock_picking_type.py @@ -0,0 +1,24 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import models +from odoo.tests import Form + + +class StockPickingType(models.Model): + _inherit = "stock.picking.type" + + def action_new_draft_picking_from_catalog(self): + """Create a new draft picking from the catalog view""" + picking_form = Form( + self.env["stock.picking"].with_context( + search_default_picking_type_id=self.ids, + default_picking_type_id=self.id, + contact_display="partner_address", + ) + ) + picking = picking_form.save() + action = picking.action_add_from_catalog() + # So we can go back safely to the new picking instead of returning to the + # previous screen + action["target"] = "main" + return action diff --git a/product_catalog_stock/readme/CONTRIBUTORS.md b/product_catalog_stock/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..3a16ddf047a --- /dev/null +++ b/product_catalog_stock/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- [Tecnativa](https://tecnativa.com) + - David Vidal diff --git a/product_catalog_stock/readme/DESCRIPTION.md b/product_catalog_stock/readme/DESCRIPTION.md new file mode 100644 index 00000000000..05b4ead465d --- /dev/null +++ b/product_catalog_stock/readme/DESCRIPTION.md @@ -0,0 +1 @@ +Implementation of the product catalog for stock pickings. diff --git a/product_catalog_stock/readme/ROADMAP.md b/product_catalog_stock/readme/ROADMAP.md new file mode 100644 index 00000000000..979a4f72fa0 --- /dev/null +++ b/product_catalog_stock/readme/ROADMAP.md @@ -0,0 +1,2 @@ +- In v17 the product catalog has the price key as mandatory. So maybe further + adaptations will be needed to support more models. diff --git a/product_catalog_stock/readme/USAGE.md b/product_catalog_stock/readme/USAGE.md new file mode 100644 index 00000000000..1e4a0581aff --- /dev/null +++ b/product_catalog_stock/readme/USAGE.md @@ -0,0 +1,5 @@ +To access the catalog from a stock picking. + +1. Create a new draft picking. +2. Click on the product catalog smart button. +3. Click it and start adding products to the picking. diff --git a/product_catalog_stock/static/description/icon.png b/product_catalog_stock/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcc49c24f364e9adf0afbc6fc0bac6dbecdeb11 GIT binary patch literal 10254 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 + + + + +Stock Product Catalog + + + +
+

Stock Product Catalog

+ + +

Beta License: AGPL-3 OCA/product-attribute Translate me on Weblate Try me on Runboat

+

Implementation of the product catalog for stock pickings.

+

Table of contents

+ +
+

Usage

+

To access the catalog from a stock picking.

+
    +
  1. Create a new draft picking.
  2. +
  3. Click on the product catalog smart button.
  4. +
  5. Click it and start adding products to the picking.
  6. +
+
+
+

Known issues / Roadmap

+
    +
  • In v17 the product catalog has the price key as mandatory. So maybe +further adaptations will be needed to support more models.
  • +
+
+
+

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

+
    +
  • Odoo SA
  • +
  • Tecnativa
  • +
+
+
+

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/product-attribute project on GitHub.

+

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

+
+
+
+ + diff --git a/product_catalog_stock/views/stock_picking_type_views.xml b/product_catalog_stock/views/stock_picking_type_views.xml new file mode 100644 index 00000000000..be8aee77907 --- /dev/null +++ b/product_catalog_stock/views/stock_picking_type_views.xml @@ -0,0 +1,17 @@ + + + + stock.picking.type + + + + + + + + diff --git a/product_catalog_stock/views/stock_picking_views.xml b/product_catalog_stock/views/stock_picking_views.xml new file mode 100644 index 00000000000..db9bada6bf7 --- /dev/null +++ b/product_catalog_stock/views/stock_picking_views.xml @@ -0,0 +1,19 @@ + + + + stock.picking + + +
+
+
+
+
From 9950cd3b50ff515c54e11eac115241c3b19bb1f7 Mon Sep 17 00:00:00 2001 From: mymage Date: Sat, 3 May 2025 18:00:24 +0000 Subject: [PATCH 02/11] Added translation using Weblate (Italian) Translated using Weblate (Italian) Currently translated at 100.0% (7 of 7 strings) Translation: product-attribute-16.0/product-attribute-16.0-product_catalog_stock Translate-URL: https://translation.odoo-community.org/projects/product-attribute-16-0/product-attribute-16-0-product_catalog_stock/it/ Translated using Weblate (Italian) Currently translated at 100.0% (7 of 7 strings) Translation: product-attribute-16.0/product-attribute-16.0-product_catalog_stock Translate-URL: https://translation.odoo-community.org/projects/product-attribute-16-0/product-attribute-16-0-product_catalog_stock/it/ --- product_catalog_stock/i18n/it.po | 54 ++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 product_catalog_stock/i18n/it.po diff --git a/product_catalog_stock/i18n/it.po b/product_catalog_stock/i18n/it.po new file mode 100644 index 00000000000..763a1724079 --- /dev/null +++ b/product_catalog_stock/i18n/it.po @@ -0,0 +1,54 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_catalog_stock +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-05-06 12:24+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.10.4\n" + +#. module: product_catalog_stock +#. odoo-python +#: code:addons/product_catalog_stock/models/stock_picking.py:0 +#, python-format +msgid "Back to picking" +msgstr "Torna al prelievo" + +#. module: product_catalog_stock +#: model_terms:ir.ui.view,arch_db:product_catalog_stock.view_picking_form +msgid "Catalog" +msgstr "Catalogo" + +#. module: product_catalog_stock +#: model:ir.model.fields,field_description:product_catalog_stock.field_stock_picking__catalog_button_text +msgid "Catalog Button Text" +msgstr "Testo pulsante catalogo" + +#. module: product_catalog_stock +#: model:ir.model,name:product_catalog_stock.model_stock_picking_type +msgid "Picking Type" +msgstr "Tipo prelievo" + +#. module: product_catalog_stock +#: model_terms:ir.ui.view,arch_db:product_catalog_stock.stock_picking_type_kanban +msgid "Planned transfer from catalog" +msgstr "Trasferimento pianificato da catalogo" + +#. module: product_catalog_stock +#: model:ir.model,name:product_catalog_stock.model_stock_move +msgid "Stock Move" +msgstr "Movimento di magazzino" + +#. module: product_catalog_stock +#: model:ir.model,name:product_catalog_stock.model_stock_picking +msgid "Transfer" +msgstr "Trasferimento" From 8c11779b953318b92f62e0d0da215b55a950ccd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Thu, 31 Jul 2025 09:52:21 +0200 Subject: [PATCH 03/11] [IMP] product_catalog_stock: pre-commit auto fixes --- product_catalog_stock/pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 product_catalog_stock/pyproject.toml diff --git a/product_catalog_stock/pyproject.toml b/product_catalog_stock/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/product_catalog_stock/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" From a5b44566194f052ea072b8eeeb212adb60a4b3c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Thu, 31 Jul 2025 09:54:10 +0200 Subject: [PATCH 04/11] [MIG] product_catalog_stock: Migration to 18.0 TT57302 --- product_catalog_stock/README.rst | 24 +++--- product_catalog_stock/__manifest__.py | 11 ++- product_catalog_stock/models/stock_picking.py | 77 +++++-------------- product_catalog_stock/readme/CONTRIBUTORS.md | 1 + product_catalog_stock/readme/ROADMAP.md | 2 - product_catalog_stock/readme/USAGE.md | 2 +- .../static/description/index.html | 38 ++++----- .../product_catalog/kanban_controller.esm.js | 13 ++++ .../product_catalog/order_line.esm.js | 8 ++ .../views/stock_picking_type_views.xml | 4 +- .../views/stock_picking_views.xml | 26 ++++--- 11 files changed, 92 insertions(+), 114 deletions(-) delete mode 100644 product_catalog_stock/readme/ROADMAP.md create mode 100644 product_catalog_stock/static/src/components/product_catalog/kanban_controller.esm.js create mode 100644 product_catalog_stock/static/src/components/product_catalog/order_line.esm.js diff --git a/product_catalog_stock/README.rst b/product_catalog_stock/README.rst index 616a687d43c..a907c5894e1 100644 --- a/product_catalog_stock/README.rst +++ b/product_catalog_stock/README.rst @@ -17,13 +17,13 @@ Stock Product Catalog :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fproduct--attribute-lightgray.png?logo=github - :target: https://github.com/OCA/product-attribute/tree/16.0/product_catalog_stock + :target: https://github.com/OCA/product-attribute/tree/18.0/product_catalog_stock :alt: OCA/product-attribute .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/product-attribute-16-0/product-attribute-16-0-product_catalog_stock + :target: https://translation.odoo-community.org/projects/product-attribute-18-0/product-attribute-18-0-product_catalog_stock :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/product-attribute&target_branch=16.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/product-attribute&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -41,22 +41,16 @@ Usage To access the catalog from a stock picking. 1. Create a new draft picking. -2. Click on the product catalog smart button. +2. Click on the product catalog button. 3. Click it and start adding products to the picking. -Known issues / Roadmap -====================== - -- In v17 the product catalog has the price key as mandatory. So maybe - further adaptations will be needed to support more models. - 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. @@ -66,15 +60,15 @@ Credits Authors ------- -* Odoo SA * Tecnativa Contributors ------------ -- `Tecnativa `__ +- `Tecnativa `__ - - David Vidal + - David Vidal + - Víctor Martínez Maintainers ----------- @@ -89,6 +83,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/product-attribute `_ project on GitHub. +This module is part of the `OCA/product-attribute `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/product_catalog_stock/__manifest__.py b/product_catalog_stock/__manifest__.py index ab9c871bae9..9189e292406 100644 --- a/product_catalog_stock/__manifest__.py +++ b/product_catalog_stock/__manifest__.py @@ -3,14 +3,19 @@ { "name": "Stock Product Catalog", "summary": "Use the product catalog on stock pickings", - "version": "16.0.1.0.0", - "author": "Odoo SA, Tecnativa, Odoo Community Association (OCA)", + "version": "18.0.1.0.0", + "author": "Tecnativa, Odoo Community Association (OCA)", "website": "https://github.com/OCA/product-attribute", "license": "AGPL-3", "category": "Product", - "depends": ["stock", "product_catalog"], + "depends": ["stock"], "data": [ "views/stock_picking_views.xml", "views/stock_picking_type_views.xml", ], + "assets": { + "web.assets_backend": [ + "product_catalog_stock/static/src/**/*", + ], + }, } diff --git a/product_catalog_stock/models/stock_picking.py b/product_catalog_stock/models/stock_picking.py index 731611df561..45f6708c4c0 100644 --- a/product_catalog_stock/models/stock_picking.py +++ b/product_catalog_stock/models/stock_picking.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from collections import defaultdict -from odoo import _, api, models +from odoo import api, models from odoo.osv import expression @@ -10,18 +10,17 @@ class StockPicking(models.Model): _name = "stock.picking" _inherit = ["stock.picking", "product.catalog.mixin"] - def _compute_catalog_button_text(self): - self.catalog_button_text = _("Back to picking") - def _get_action_add_from_catalog_extra_context(self): return { **super()._get_action_add_from_catalog_extra_context(), "order_id": self.id, } - def _default_order_line_values(self): - default_data = super()._default_order_line_values() - new_default_data = self.env["stock.move"]._get_product_catalog_lines_data() + def _default_order_line_values(self, child_field=False): + default_data = super()._default_order_line_values(child_field) + new_default_data = self.env["stock.move"]._get_product_catalog_lines_data( + parent_record=self + ) return {**default_data, **new_default_data} def _get_product_catalog_domain(self): @@ -32,7 +31,7 @@ def _get_product_catalog_domain(self): ] ) - def _get_product_catalog_record_lines(self, product_ids): + def _get_product_catalog_record_lines(self, product_ids, **kwargs): grouped_moves = defaultdict(lambda: self.env["stock.move"]) for move in self.move_ids: if move.product_id.id not in product_ids: @@ -40,6 +39,10 @@ def _get_product_catalog_record_lines(self, product_ids): grouped_moves[move.product_id] |= move return grouped_moves + def _get_product_price_and_data(self, product): + self.ensure_one() + return {"price": product.list_price} + @api.model def _prepare_stock_move_vals_from_catalog(self, product_id, quantity): self.ensure_one() @@ -74,14 +77,13 @@ def _update_order_line_info(self, product_id, quantity, **kwargs): move.product_uom_qty = quantity elif self.state == "draft": move.unlink() - return None else: move.product_uom_qty = 0 elif quantity > 0: move = self.env["stock.move"].create( self._prepare_stock_move_vals_from_catalog(product_id, quantity) ) - return None + return self.env["product.product"].browse(product_id).list_price def _is_readonly(self): """Return Whether the sale order is read-only or not based on the state or the @@ -100,53 +102,12 @@ def _is_readonly(self): class StockMove(models.Model): _inherit = "stock.move" - def _get_product_catalog_lines_data(self, **kwargs): - """Return information about sale order lines in `self`. - - If `self` is empty, this method returns only the default value(s) needed for - the product catalog. In this case, the quantity that equals 0. - - Otherwise, it returns a quantity and a price based on the product of the SOL(s) - and whether the product is read-only or not. - - A product is considered read-only if the picking is cancelled or done. - - Note: This method cannot be called with multiple records that have different - products linked. - - :raise odoo.exceptions.ValueError: ``len(self.product_id) != 1`` - :rtype: dict - :return: A dict with the following structure: - { - 'quantity': float, - 'readOnly': bool, - } - """ - if len(self) == 1: - res = { - "quantity": self.product_uom_qty, - "readOnly": self.picking_id.state in ["cancel", "done"], - } - return res - elif self: - self.product_id.ensure_one() - res = { - "readOnly": True, - "quantity": sum( - self.mapped( - lambda move: move.product_uom._compute_quantity( - qty=move.product_uom_qty, - to_unit=move.product_id.uom_id, - ) - ) - ), - } - return res - else: - return { - "quantity": 0, - } - - def action_add_from_catalog(self): + def action_add_from_catalog_picking(self): picking = self.env["stock.picking"].browse(self.env.context.get("order_id")) return picking.action_add_from_catalog() + + def _get_product_catalog_lines_data(self, parent_record=False, **kwargs): + data = super()._get_product_catalog_lines_data(parent_record, **kwargs) + if "readOnly" in data: + data["readOnly"] = self.picking_id._is_readonly() + return data diff --git a/product_catalog_stock/readme/CONTRIBUTORS.md b/product_catalog_stock/readme/CONTRIBUTORS.md index 3a16ddf047a..83e9344d4f7 100644 --- a/product_catalog_stock/readme/CONTRIBUTORS.md +++ b/product_catalog_stock/readme/CONTRIBUTORS.md @@ -1,2 +1,3 @@ - [Tecnativa](https://tecnativa.com) - David Vidal + - Víctor Martínez diff --git a/product_catalog_stock/readme/ROADMAP.md b/product_catalog_stock/readme/ROADMAP.md deleted file mode 100644 index 979a4f72fa0..00000000000 --- a/product_catalog_stock/readme/ROADMAP.md +++ /dev/null @@ -1,2 +0,0 @@ -- In v17 the product catalog has the price key as mandatory. So maybe further - adaptations will be needed to support more models. diff --git a/product_catalog_stock/readme/USAGE.md b/product_catalog_stock/readme/USAGE.md index 1e4a0581aff..ab96d4285cc 100644 --- a/product_catalog_stock/readme/USAGE.md +++ b/product_catalog_stock/readme/USAGE.md @@ -1,5 +1,5 @@ To access the catalog from a stock picking. 1. Create a new draft picking. -2. Click on the product catalog smart button. +2. Click on the product catalog button. 3. Click it and start adding products to the picking. diff --git a/product_catalog_stock/static/description/index.html b/product_catalog_stock/static/description/index.html index 4d6693c954c..f83c21a90d2 100644 --- a/product_catalog_stock/static/description/index.html +++ b/product_catalog_stock/static/description/index.html @@ -369,18 +369,17 @@

Stock Product Catalog

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:81951bf911839ba03bb70ce4946072f00d67c64a25729b5a21aec077be5dce1f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/product-attribute Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/product-attribute Translate me on Weblate Try me on Runboat

Implementation of the product catalog for stock pickings.

Table of contents

-
-

Known issues / Roadmap

-
    -
  • In v17 the product catalog has the price key as mandatory. So maybe -further adaptations will be needed to support more models.
  • -
-
-

Bug Tracker

+

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.

-

Credits

+

Credits

-

Authors

+

Authors

    -
  • Odoo SA
  • Tecnativa
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -436,7 +428,7 @@

Maintainers

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/product-attribute project on GitHub.

+

This module is part of the OCA/product-attribute project on GitHub.

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

diff --git a/product_catalog_stock/static/src/components/product_catalog/kanban_controller.esm.js b/product_catalog_stock/static/src/components/product_catalog/kanban_controller.esm.js new file mode 100644 index 00000000000..5ab5ada5045 --- /dev/null +++ b/product_catalog_stock/static/src/components/product_catalog/kanban_controller.esm.js @@ -0,0 +1,13 @@ +import {_t} from "@web/core/l10n/translation"; +import {ProductCatalogKanbanController} from "@product/product_catalog/kanban_controller"; +import {patch} from "@web/core/utils/patch"; + +patch(ProductCatalogKanbanController.prototype, { + async _defineButtonContent() { + if (this.orderResModel === "stock.picking") { + this.buttonString = _t("Back to picking"); + } else { + super._defineButtonContent(); + } + }, +}); diff --git a/product_catalog_stock/static/src/components/product_catalog/order_line.esm.js b/product_catalog_stock/static/src/components/product_catalog/order_line.esm.js new file mode 100644 index 00000000000..1ee29dc402f --- /dev/null +++ b/product_catalog_stock/static/src/components/product_catalog/order_line.esm.js @@ -0,0 +1,8 @@ +import {ProductCatalogOrderLine} from "@product/product_catalog/order_line/order_line"; +import {patch} from "@web/core/utils/patch"; + +patch(ProductCatalogOrderLine.prototype, { + get showPrice() { + return super.showPrice && this.env.orderResModel !== "stock.picking"; + }, +}); diff --git a/product_catalog_stock/views/stock_picking_type_views.xml b/product_catalog_stock/views/stock_picking_type_views.xml index be8aee77907..ea6529f47a3 100644 --- a/product_catalog_stock/views/stock_picking_type_views.xml +++ b/product_catalog_stock/views/stock_picking_type_views.xml @@ -4,14 +4,14 @@ stock.picking.type - + diff --git a/product_catalog_stock/views/stock_picking_views.xml b/product_catalog_stock/views/stock_picking_views.xml index db9bada6bf7..78548aceee6 100644 --- a/product_catalog_stock/views/stock_picking_views.xml +++ b/product_catalog_stock/views/stock_picking_views.xml @@ -4,16 +4,22 @@ stock.picking -
-
+ + + +