diff --git a/pos_product_default_packaging_level/README.rst b/pos_product_default_packaging_level/README.rst new file mode 100644 index 0000000000..3eb35b740d --- /dev/null +++ b/pos_product_default_packaging_level/README.rst @@ -0,0 +1,97 @@ +=================================== +Pos Product Default Packaging Level +=================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:92054262b1aaba9ccf11af4b24649b3ca7baa1b3923232b8d1788691d78269b7 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fpos-lightgray.png?logo=github + :target: https://github.com/OCA/pos/tree/18.0/pos_product_default_packaging_level + :alt: OCA/pos +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/pos-18-0/pos-18-0-pos_product_default_packaging_level + :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/pos&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to display on POS product cards the product default +packaging. + +|image| + +.. |image| image:: https://raw.githubusercontent.com/OCA/pos/18.0/pos_product_default_packaging_level/static/description/pos_default_packaging.png + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + +When people manipulate products, they need to identify what is the +default packaging in order to be sure they have the good one in hands. + +In POS, it is useful to hav it too for those reasons. + +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 +------- + +* ACSONE SA/NV + +Contributors +------------ + +- 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. + +.. |maintainer-rousseldenis| image:: https://github.com/rousseldenis.png?size=40px + :target: https://github.com/rousseldenis + :alt: rousseldenis + +Current `maintainer `__: + +|maintainer-rousseldenis| + +This module is part of the `OCA/pos `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/pos_product_default_packaging_level/__init__.py b/pos_product_default_packaging_level/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/pos_product_default_packaging_level/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/pos_product_default_packaging_level/__manifest__.py b/pos_product_default_packaging_level/__manifest__.py new file mode 100644 index 0000000000..bbd653635b --- /dev/null +++ b/pos_product_default_packaging_level/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Pos Product Default Packaging Level", + "summary": """This module allows to show product default packaging level""", + "version": "18.0.1.0.0", + "license": "AGPL-3", + "author": "ACSONE SA/NV,Odoo Community Association (OCA)", + "maintainers": ["rousseldenis"], + "website": "https://github.com/OCA/pos", + "depends": ["point_of_sale", "product_packaging_level"], + "assets": { + "point_of_sale._assets_pos": [ + "pos_product_default_packaging_level/static/src/ProductScreen.esm.js", + "pos_product_default_packaging_level/static/src/**/*.xml", + ] + }, +} diff --git a/pos_product_default_packaging_level/models/__init__.py b/pos_product_default_packaging_level/models/__init__.py new file mode 100644 index 0000000000..a937af2848 --- /dev/null +++ b/pos_product_default_packaging_level/models/__init__.py @@ -0,0 +1,2 @@ +from . import product_product +from . import product_packaging diff --git a/pos_product_default_packaging_level/models/product_packaging.py b/pos_product_default_packaging_level/models/product_packaging.py new file mode 100644 index 0000000000..5c5afe309f --- /dev/null +++ b/pos_product_default_packaging_level/models/product_packaging.py @@ -0,0 +1,29 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, models +from odoo.osv.expression import OR, is_leaf + + +class ProductPackaging(models.Model): + _inherit = "product.packaging" + + @api.model + def _load_pos_data_domain(self, data) -> list: + """ + Find the barcode domain to add packaging that have + the default level. + """ + domain = super()._load_pos_data_domain(data) + new_domain = list() + for element in domain: + found = False + if is_leaf(element): + if element[0] == "barcode": + new_element = OR( + [[element], [("packaging_level_id.is_default", "=", True)]] + ) + new_domain.extend(new_element) + found = True + if not found: + new_domain.append(element) + return new_domain diff --git a/pos_product_default_packaging_level/models/product_product.py b/pos_product_default_packaging_level/models/product_product.py new file mode 100644 index 0000000000..d1087acc97 --- /dev/null +++ b/pos_product_default_packaging_level/models/product_product.py @@ -0,0 +1,13 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, models + + +class ProductProduct(models.Model): + _inherit = "product.product" + + @api.model + def _load_pos_data_fields(self, config_id): + res = super()._load_pos_data_fields(config_id) + res.append("from_default_level_packaging_id") + return res diff --git a/pos_product_default_packaging_level/pyproject.toml b/pos_product_default_packaging_level/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/pos_product_default_packaging_level/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/pos_product_default_packaging_level/readme/CONTEXT.md b/pos_product_default_packaging_level/readme/CONTEXT.md new file mode 100644 index 0000000000..cfbaa7dd62 --- /dev/null +++ b/pos_product_default_packaging_level/readme/CONTEXT.md @@ -0,0 +1,4 @@ +When people manipulate products, they need to identify what is the default +packaging in order to be sure they have the good one in hands. + +In POS, it is useful to hav it too for those reasons. diff --git a/pos_product_default_packaging_level/readme/CONTRIBUTORS.md b/pos_product_default_packaging_level/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..12dbecdd58 --- /dev/null +++ b/pos_product_default_packaging_level/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Denis Roussel diff --git a/pos_product_default_packaging_level/readme/DESCRIPTION.md b/pos_product_default_packaging_level/readme/DESCRIPTION.md new file mode 100644 index 0000000000..68c8c124b8 --- /dev/null +++ b/pos_product_default_packaging_level/readme/DESCRIPTION.md @@ -0,0 +1,4 @@ +This module allows to display on POS product cards the product default packaging. + + +![image](../static/description/pos_default_packaging.png) \ No newline at end of file diff --git a/pos_product_default_packaging_level/static/description/icon.png b/pos_product_default_packaging_level/static/description/icon.png new file mode 100644 index 0000000000..3a0328b516 Binary files /dev/null and b/pos_product_default_packaging_level/static/description/icon.png differ diff --git a/pos_product_default_packaging_level/static/description/index.html b/pos_product_default_packaging_level/static/description/index.html new file mode 100644 index 0000000000..a636c47108 --- /dev/null +++ b/pos_product_default_packaging_level/static/description/index.html @@ -0,0 +1,434 @@ + + + + + +Pos Product Default Packaging Level + + + +
+

Pos Product Default Packaging Level

+ + +

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

+

This module allows to display on POS product cards the product default +packaging.

+

image

+

Table of contents

+ +
+

Use Cases / Context

+

When people manipulate products, they need to identify what is the +default packaging in order to be sure they have the good one in hands.

+

In POS, it is useful to hav it too for those reasons.

+
+
+

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

+
    +
  • ACSONE SA/NV
  • +
+
+
+

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.

+

Current maintainer:

+

rousseldenis

+

This module is part of the OCA/pos project on GitHub.

+

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

+
+
+
+ + diff --git a/pos_product_default_packaging_level/static/description/pos_default_packaging.png b/pos_product_default_packaging_level/static/description/pos_default_packaging.png new file mode 100644 index 0000000000..e08e957d5b Binary files /dev/null and b/pos_product_default_packaging_level/static/description/pos_default_packaging.png differ diff --git a/pos_product_default_packaging_level/static/src/ProductScreen.esm.js b/pos_product_default_packaging_level/static/src/ProductScreen.esm.js new file mode 100644 index 0000000000..a1f17b2934 --- /dev/null +++ b/pos_product_default_packaging_level/static/src/ProductScreen.esm.js @@ -0,0 +1,36 @@ +// Copyright 2026 ACSONE SA/NV +// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import {ProductCard} from "@point_of_sale/app/generic_components/product_card/product_card"; +import {ProductProduct} from "@point_of_sale/app/models/product_product"; +import {patch} from "@web/core/utils/patch"; + +patch(ProductCard.prototype, { + setup(vals) { + super.setup(vals); + if (!this.from_default_level_packaging_id) { + return; + } + }, + get multiDefaultPackagingLevel() { + return ( + Boolean(this.props.product.variants) && + Boolean(this.props.product.variants.length > 1) && + Boolean(this.props.product.from_default_level_packaging_id) && + this.props.product.from_default_level_packaging_id + ); + }, + get defaultPackagingLevel() { + return ( + Boolean(this.props.product.from_default_level_packaging_id) && + this.props.product.from_default_level_packaging_id + ); + }, +}); + +patch(ProductProduct.prototype, { + get defaultPackagingLevel() { + return this.from_default_level_packaging_id + ? this.from_default_level_packaging_id.name + : this.uom_id.name; + }, +}); diff --git a/pos_product_default_packaging_level/static/src/ProductScreen.xml b/pos_product_default_packaging_level/static/src/ProductScreen.xml new file mode 100644 index 0000000000..e9ad6ca905 --- /dev/null +++ b/pos_product_default_packaging_level/static/src/ProductScreen.xml @@ -0,0 +1,52 @@ + + + + +
+