diff --git a/product_logistics_uom/README.rst b/product_logistics_uom/README.rst new file mode 100644 index 00000000000..a2c058118c2 --- /dev/null +++ b/product_logistics_uom/README.rst @@ -0,0 +1,158 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +===================== +Product logistics UoM +===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:326d9bbcf8543523257fb6237f3387b9f67e4e3c781935665691ac2055f58ab2 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fproduct--attribute-lightgray.png?logo=github + :target: https://github.com/OCA/product-attribute/tree/19.0/product_logistics_uom + :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-19-0/product-attribute-19-0-product_logistics_uom + :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=19.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to choose an Unit Of Measure (UoM) for products +weight and volume. It can be set product per product for users in +group_uom. + +Without this module, you only have the choice between Kg or Lb(s) and m³ +for all the products. + +For some business cases, you need to express in more precise UoM than +default ones like Liters instead of M³. + +Even if you choose another UoM for the weight or volume, the system will +still store the value for these fields in the Odoo default UoM (Kg or +Lb(s) and m³). This ensures that the arithmetic operations on these +fields are correct and consistent with the rest of the addons. + +Once this addon is installed values stored into the initial Volume and +Weight fields on the product and product template models are no more +rounded to the decimal precision defined for these fields. This could +lead to some side effects into reportss where these fields are used. You +can replace the fields by the new ones provided by this addon to avoid +this problem (product_volume and product_weight). In any cases, since +you use different UoM by product, you should most probably modify your +reportss to display the right UoM. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +Be aware, that this module only change the UoM but not the value. + +It's the same behavior as base Odoo when you change from Metric System +to Imperial System. + +Configuration +============= + +To change the default UoM + +1. Go "General Settings", then in "Products" +2. you have to select a default unit of measure for weights and volumes. + +To change on a specific product + +1. Go the product form you can change the UoM directly. + +Usage +===== + +Once installed and the 'Sell and purchase products in different units of +measure' option is enabled, the 'Unit of Measure' field will become +updatable on the 'Product' form for users with the permission 'Manage +Multiple Units of Measure'. + +If the displayed value is 0.00 and a warning icon is displayed in front +of the unit of measure, it means that the value is too small to be +displayed in the current unit of measure. You should change the unit of +measure to a larger one to see the value. + +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 +------- + +* Akretion +* ACSONE SA/NV + +Contributors +------------ + +- Raphaël Reverdy +- Fernando La Chica +- Laurent Mignon +- Nhan Tran +- `Studio73 `__: + + - Eugenio Micó + +Other credits +------------- + +The development of this module has been financially supported by: + +- Akretion +- La Base + +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-hparfr| image:: https://github.com/hparfr.png?size=40px + :target: https://github.com/hparfr + :alt: hparfr + +Current `maintainer `__: + +|maintainer-hparfr| + +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_logistics_uom/__init__.py b/product_logistics_uom/__init__.py new file mode 100644 index 00000000000..6d58305f5dd --- /dev/null +++ b/product_logistics_uom/__init__.py @@ -0,0 +1,2 @@ +from . import models +from .hooks import pre_init_hook diff --git a/product_logistics_uom/__manifest__.py b/product_logistics_uom/__manifest__.py new file mode 100644 index 00000000000..c27527d4a3b --- /dev/null +++ b/product_logistics_uom/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright 2020 Akretion (https://www.akretion.com). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Product logistics UoM", + "summary": "Configure product weights and volume UoM", + "version": "19.0.1.0.0", + "development_status": "Beta", + "category": "Product", + "website": "https://github.com/OCA/product-attribute", + "author": " Akretion, ACSONE SA/NV, Odoo Community Association (OCA)", + "maintainers": ["hparfr"], + "license": "AGPL-3", + "installable": True, + "depends": [ + "product", + ], + "data": [ + "views/res_config_settings.xml", + "views/product.xml", + ], + "pre_init_hook": "pre_init_hook", +} diff --git a/product_logistics_uom/hooks.py b/product_logistics_uom/hooks.py new file mode 100644 index 00000000000..b05316cc4d7 --- /dev/null +++ b/product_logistics_uom/hooks.py @@ -0,0 +1,133 @@ +# Copyright 2023 ACSONE SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +import logging + +from odoo.tools import SQL, sql + +_logger = logging.getLogger(__name__) + + +def pre_init_hook(env): # pragma: nocover + """Recompute the volume and weight column on product and template + by converting the value from the uom defined on the product to the default uom + """ + if sql.column_exists(env.cr, "product_template", "volume_uom_id"): + _logger.info("Recompute volume on product.product") + # get default m3 uom + env.cr.execute( + SQL(""" + SELECT res_id + FROM ir_model_data + WHERE module = 'uom' AND name = 'product_uom_cubic_meter' + """) + ) + m3_uom_id = env.cr.fetchone()[0] + # get uom factor + env.cr.execute( + SQL( + """ + SELECT factor + FROM uom_uom + WHERE id = %s + """, + m3_uom_id, + ) + ) + m3_uom_factor = env.cr.fetchone()[0] + # update volume where volume_uom_id is not null and not m3 + env.cr.execute( + SQL( + """ + UPDATE product_product + SET volume = product_product.volume / product_uom.factor * %s + FROM uom_uom product_uom, + product_template pt + WHERE product_uom.id = pt.volume_uom_id + AND pt.id = product_product.product_tmpl_id + AND pt.volume_uom_id IS NOT NULL AND pt.volume_uom_id != %s + """, + m3_uom_factor, + m3_uom_id, + ) + ) + _logger.info(f"{env.cr.rowcount} product_product rows updated") + # update product_template with 1 product_product + env.cr.execute( + SQL( + """ + UPDATE product_template + SET Volume = unique_product.volume + FROM ( + SELECT product_tmpl_id, volume + FROM product_product + WHERE volume is not null + GROUP BY product_tmpl_id, volume + HAVING COUNT(*) = 1 + ) unique_product + WHERE product_template.id = unique_product.product_tmpl_id + AND product_template.volume_uom_id != %s + """, + m3_uom_id, + ) + ) + _logger.info(f"{env.cr.rowcount} product_template rows updated") + if sql.column_exists(env.cr, "product_template", "weight_uom_id"): + _logger.info("Recompute weight on product.product") + # get default kg uom + env.cr.execute( + SQL(""" + SELECT res_id + FROM ir_model_data + WHERE module = 'uom' AND name = 'product_uom_kgm' + """) + ) + kg_uom_id = env.cr.fetchone()[0] + # get uom factor + env.cr.execute( + SQL( + """ + SELECT factor + FROM uom_uom + WHERE id = %s + """, + kg_uom_id, + ) + ) + kg_uom_factor = env.cr.fetchone()[0] + # update weight where weight_uom_id is not null and not kg + env.cr.execute( + SQL( + """ + UPDATE product_product + SET weight = product_product.weight / product_uom.factor * %s + FROM uom_uom product_uom, product_template pt + WHERE product_uom.id = pt.weight_uom_id + AND pt.id = product_product.product_tmpl_id + AND pt.weight_uom_id IS NOT NULL AND pt.weight_uom_id != %s + """, + kg_uom_factor, + kg_uom_id, + ) + ) + _logger.info(f"{env.cr.rowcount} product_product rows updated") + # update product_template with 1 product_product + env.cr.execute( + SQL( + """ + UPDATE product_template + SET weight = unique_product.weight + FROM ( + SELECT product_tmpl_id, weight + FROM product_product + WHERE volume is not null + GROUP BY product_tmpl_id, weight + HAVING COUNT(*) = 1 + ) unique_product + WHERE product_template.id = unique_product.product_tmpl_id + AND product_template.weight_uom_id != %s + """, + kg_uom_id, + ) + ) + _logger.info(f"{env.cr.rowcount} product_template rows updated") diff --git a/product_logistics_uom/i18n/de.po b/product_logistics_uom/i18n/de.po new file mode 100644 index 00000000000..606f68fbe1c --- /dev/null +++ b/product_logistics_uom/i18n/de.po @@ -0,0 +1,210 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_logistics_uom +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-11-04 14:44+0000\n" +"Last-Translator: Maria Sparenberg \n" +"Language-Team: none\n" +"Language: de\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.14.1\n" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurationseinstellungen" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_length_uom_id +msgid "Default Length Unit of Measure" +msgstr "Standard-ME für Längen" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_volume_uom_id +msgid "Default Volume Unit of Measure" +msgstr "Standard-ME für Volumen" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_weight_uom_id +msgid "Default Weight Unit of Measure" +msgstr "Standard-ME für Gewicht" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_length_uom_id +msgid "Default unit of measure to express product length" +msgstr "Dies ist die Standard-Mengeneinheit für Produktlängen." + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_volume_uom_id +msgid "Default unit of measure to express product volume" +msgstr "Dies ist die Standard-Mengeneinheit für Produktvolumen." + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_weight_uom_id +msgid "Default unit of measure to express product weight" +msgstr "Dies ist die Standard-Mengeneinheit für Produktgewichte." + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.res_config_settings_view_form +msgid "Define your length unit of measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight +msgid "Gross Weight" +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.res_config_settings_view_form +msgid "Length" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_product_template +msgid "Product" +msgstr "Produkt" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_product_product +msgid "Product Variant" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__show_volume_uom_warning +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__show_volume_uom_warning +msgid "Show Volume Uom Warning" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__show_weight_uom_warning +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__show_weight_uom_warning +msgid "Show Weight Uom Warning" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__show_volume_uom_warning +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__show_volume_uom_warning +msgid "" +"Technical field used to warn the user to change the volumeuom since the " +"value for product_volume is too small and has beenrounded." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__show_weight_uom_warning +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__show_weight_uom_warning +msgid "" +"Technical field used to warn the user to change the weightuom since the " +"value for product_weight is too small and has beenrounded." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__product_volume +msgid "The volume in the product's volume UOM." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__product_weight +msgid "The weight in the product's weight UOM." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "Volume" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume_uom_id +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume_uom_id +msgid "Volume Unit of Measure" +msgstr "Volumen-ME" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__product_volume +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__product_volume +msgid "Volume in product UOM" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume_uom_name +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume_uom_name +msgid "Volume unit of measure label" +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "Weight" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight_uom_id +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight_uom_id +msgid "Weight Unit of Measure" +msgstr "Gewicht-ME" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__product_weight +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__product_weight +msgid "Weight in product UOM" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__weight +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__weight +msgid "Weight of the product with its container and packaging." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight_uom_name +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight_uom_name +msgid "Weight unit of measure label" +msgstr "" diff --git a/product_logistics_uom/i18n/es.po b/product_logistics_uom/i18n/es.po new file mode 100644 index 00000000000..ee662d1ebfd --- /dev/null +++ b/product_logistics_uom/i18n/es.po @@ -0,0 +1,285 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_logistics_uom +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-08-29 08:30+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: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_res_config_settings +msgid "Config Settings" +msgstr "Ajustes de configuración" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_length_uom_id +msgid "Default Length Unit of Measure" +msgstr "Unidad de medida de longitud por defecto" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_volume_uom_id +msgid "Default Volume Unit of Measure" +msgstr "Unidad de medida de volumen predeterminada" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_weight_uom_id +msgid "Default Weight Unit of Measure" +msgstr "Unidad de medida de peso predeterminada" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_length_uom_id +msgid "Default unit of measure to express product length" +msgstr "Unidad de medida por defecto para expresar la longitud del producto" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_volume_uom_id +msgid "Default unit of measure to express product volume" +msgstr "Unidad de medida del volumen del producto predeterminada" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_weight_uom_id +msgid "Default unit of measure to express product weight" +msgstr "Unidad de medida del peso del producto predeterminada" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.res_config_settings_view_form +msgid "Define your length unit of measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight +msgid "Gross Weight" +msgstr "Peso bruto" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.res_config_settings_view_form +msgid "Length" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_product_template +msgid "Product" +msgstr "Producto" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_product_product +msgid "Product Variant" +msgstr "Variante del producto" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__show_volume_uom_warning +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__show_volume_uom_warning +msgid "Show Volume Uom Warning" +msgstr "Mostrar advertencia de volumen Uom" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__show_weight_uom_warning +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__show_weight_uom_warning +msgid "Show Weight Uom Warning" +msgstr "Mostrar advertencia de peso Uom" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__show_volume_uom_warning +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__show_volume_uom_warning +msgid "" +"Technical field used to warn the user to change the volumeuom since the " +"value for product_volume is too small and has beenrounded." +msgstr "" +"Campo técnico utilizado para advertir al usuario que cambie el volumen ya " +"que el valor de product_volume es demasiado pequeño y ha sido redondeado." + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__show_weight_uom_warning +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__show_weight_uom_warning +msgid "" +"Technical field used to warn the user to change the weightuom since the " +"value for product_weight is too small and has beenrounded." +msgstr "" +"Campo técnico utilizado para advertir al usuario que cambie el peso ya que " +"el valor de peso_producto es demasiado pequeño y ha sido redondeado." + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__product_volume +msgid "The volume in the product's volume UOM." +msgstr "El volumen en la UM de volumen del producto." + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__product_weight +msgid "The weight in the product's weight UOM." +msgstr "El peso en la UM de peso del producto." + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "Volume" +msgstr "Volumen" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume_uom_id +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume_uom_id +msgid "Volume Unit of Measure" +msgstr "Unidad de medida de volumen" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__product_volume +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__product_volume +msgid "Volume in product UOM" +msgstr "Volumen en la UM del producto" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume_uom_name +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume_uom_name +msgid "Volume unit of measure label" +msgstr "Etiqueta de unidad de medida de volumen" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "Weight" +msgstr "Peso" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight_uom_id +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight_uom_id +msgid "Weight Unit of Measure" +msgstr "Unidad de medida del peso" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__product_weight +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__product_weight +msgid "Weight in product UOM" +msgstr "Peso en la UM del producto" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__weight +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__weight +msgid "Weight of the product with its container and packaging." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight_uom_name +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight_uom_name +msgid "Weight unit of measure label" +msgstr "Etiqueta de unidad de medida del peso" + +#~ msgid "" +#~ "\n" +" " + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" +"\n" +" \n" +" " + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" +"\n" +" \n" +" " + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" +"\n" +" \n" +" " + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni di configurazione" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_length_uom_id +msgid "Default Length Unit of Measure" +msgstr "Unità di misura lunghezza predefinita" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_volume_uom_id +msgid "Default Volume Unit of Measure" +msgstr "Unità di misura volume predefinito" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_weight_uom_id +msgid "Default Weight Unit of Measure" +msgstr "Unità di misura peso predefinito" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_length_uom_id +msgid "Default unit of measure to express product length" +msgstr "Unità di misura predefiita per esprimere la lunghezza di prodotto" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_volume_uom_id +msgid "Default unit of measure to express product volume" +msgstr "Unità di misura predefiita per esprimere il volume di prodotto" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_weight_uom_id +msgid "Default unit of measure to express product weight" +msgstr "Unità di misura predefinita per esprimere il peso di prodotto" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.res_config_settings_view_form +msgid "Define your length unit of measure" +msgstr "Definire l'unità di misura della lunghezza" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight +msgid "Gross Weight" +msgstr "Peso lordo" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.res_config_settings_view_form +msgid "Length" +msgstr "Lunghezza" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_product_template +msgid "Product" +msgstr "Prodotto" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_product_product +msgid "Product Variant" +msgstr "Variante prodotto" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__show_volume_uom_warning +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__show_volume_uom_warning +msgid "Show Volume Uom Warning" +msgstr "Visualizza allerta UdM volume" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__show_weight_uom_warning +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__show_weight_uom_warning +msgid "Show Weight Uom Warning" +msgstr "Visualizza allerta UdM peso" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__show_volume_uom_warning +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__show_volume_uom_warning +msgid "" +"Technical field used to warn the user to change the volumeuom since the " +"value for product_volume is too small and has beenrounded." +msgstr "" +"Campo tecnico utilizzato per avvisare l'utente di modificare l'UdM del " +"volume perché il volume del prodotto è troppo piccolo e deve essere " +"arrotondato." + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__show_weight_uom_warning +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__show_weight_uom_warning +msgid "" +"Technical field used to warn the user to change the weightuom since the " +"value for product_weight is too small and has beenrounded." +msgstr "" +"Campo tecnico utilizzato per avvisare l'utente di modificare l'UdM del peso " +"perché il peso del prodotto è troppo piccolo e deve essere arrotondato." + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__product_volume +msgid "The volume in the product's volume UOM." +msgstr "Il volume nell'UdM del volume del prodotto." + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__product_weight +msgid "The weight in the product's weight UOM." +msgstr "Il peso nell'UdM del peso del prodotto." + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "Volume" +msgstr "Volume" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume_uom_id +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume_uom_id +msgid "Volume Unit of Measure" +msgstr "Unità di misura del volume" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__product_volume +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__product_volume +msgid "Volume in product UOM" +msgstr "Volume nell'UdM del prodotto" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume_uom_name +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume_uom_name +msgid "Volume unit of measure label" +msgstr "Etichetta unità di misura volume" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "Weight" +msgstr "Peso" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight_uom_id +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight_uom_id +msgid "Weight Unit of Measure" +msgstr "Unità di misura del peso" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__product_weight +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__product_weight +msgid "Weight in product UOM" +msgstr "Peso nell'UdM del prodotto" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__weight +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__weight +msgid "Weight of the product with its container and packaging." +msgstr "Peso del prodotto con il suo contenitore e imballaggio." + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight_uom_name +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight_uom_name +msgid "Weight unit of measure label" +msgstr "Etichetta unità di misura peso" + +#~ msgid "" +#~ "\n" +#~ " " + +#~ msgid "" +#~ "\n" +#~ " " + +#~ msgid "" +#~ "\n" +#~ " " + +#~ msgid "" +#~ "\n" +#~ " " + +#~ msgid "Product Uom Readonly" +#~ msgstr "Prodotto Udm sola lettura" diff --git a/product_logistics_uom/i18n/product_logistics_uom.pot b/product_logistics_uom/i18n/product_logistics_uom.pot new file mode 100644 index 00000000000..945136ef6ca --- /dev/null +++ b/product_logistics_uom/i18n/product_logistics_uom.pot @@ -0,0 +1,199 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_logistics_uom +# +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: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_length_uom_id +msgid "Default Length Unit of Measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_volume_uom_id +msgid "Default Volume Unit of Measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_weight_uom_id +msgid "Default Weight Unit of Measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_length_uom_id +msgid "Default unit of measure to express product length" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_volume_uom_id +msgid "Default unit of measure to express product volume" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_weight_uom_id +msgid "Default unit of measure to express product weight" +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.res_config_settings_view_form +msgid "Define your length unit of measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight +msgid "Gross Weight" +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.res_config_settings_view_form +msgid "Length" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_product_template +msgid "Product" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_product_product +msgid "Product Variant" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__show_volume_uom_warning +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__show_volume_uom_warning +msgid "Show Volume Uom Warning" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__show_weight_uom_warning +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__show_weight_uom_warning +msgid "Show Weight Uom Warning" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__show_volume_uom_warning +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__show_volume_uom_warning +msgid "" +"Technical field used to warn the user to change the volumeuom since the " +"value for product_volume is too small and has beenrounded." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__show_weight_uom_warning +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__show_weight_uom_warning +msgid "" +"Technical field used to warn the user to change the weightuom since the " +"value for product_weight is too small and has beenrounded." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__product_volume +msgid "The volume in the product's volume UOM." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__product_weight +msgid "The weight in the product's weight UOM." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "Volume" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume_uom_id +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume_uom_id +msgid "Volume Unit of Measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__product_volume +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__product_volume +msgid "Volume in product UOM" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume_uom_name +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume_uom_name +msgid "Volume unit of measure label" +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "Weight" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight_uom_id +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight_uom_id +msgid "Weight Unit of Measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__product_weight +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__product_weight +msgid "Weight in product UOM" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__weight +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__weight +msgid "Weight of the product with its container and packaging." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight_uom_name +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight_uom_name +msgid "Weight unit of measure label" +msgstr "" diff --git a/product_logistics_uom/i18n/pt_BR.po b/product_logistics_uom/i18n/pt_BR.po new file mode 100644 index 00000000000..613b6f8623f --- /dev/null +++ b/product_logistics_uom/i18n/pt_BR.po @@ -0,0 +1,208 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_logistics_uom +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pt_BR\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" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "" +"\n" +" \n" +" " +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_length_uom_id +msgid "Default Length Unit of Measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_volume_uom_id +msgid "Default Volume Unit of Measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_res_config_settings__product_default_weight_uom_id +msgid "Default Weight Unit of Measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_length_uom_id +msgid "Default unit of measure to express product length" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_volume_uom_id +msgid "Default unit of measure to express product volume" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_res_config_settings__product_default_weight_uom_id +msgid "Default unit of measure to express product weight" +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.res_config_settings_view_form +msgid "Define your length unit of measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight +msgid "Gross Weight" +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.res_config_settings_view_form +msgid "Length" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_product_template +msgid "Product" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model,name:product_logistics_uom.model_product_product +msgid "Product Variant" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__show_volume_uom_warning +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__show_volume_uom_warning +msgid "Show Volume Uom Warning" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__show_weight_uom_warning +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__show_weight_uom_warning +msgid "Show Weight Uom Warning" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__show_volume_uom_warning +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__show_volume_uom_warning +msgid "" +"Technical field used to warn the user to change the volumeuom since the " +"value for product_volume is too small and has beenrounded." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__show_weight_uom_warning +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__show_weight_uom_warning +msgid "" +"Technical field used to warn the user to change the weightuom since the " +"value for product_weight is too small and has beenrounded." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__product_volume +msgid "The volume in the product's volume UOM." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__product_weight +msgid "The weight in the product's weight UOM." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "Volume" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume_uom_id +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume_uom_id +msgid "Volume Unit of Measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__product_volume +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__product_volume +msgid "Volume in product UOM" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__volume_uom_name +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__volume_uom_name +msgid "Volume unit of measure label" +msgstr "" + +#. module: product_logistics_uom +#: model_terms:ir.ui.view,arch_db:product_logistics_uom.product_template_form_view +msgid "Weight" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight_uom_id +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight_uom_id +msgid "Weight Unit of Measure" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__product_weight +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__product_weight +msgid "Weight in product UOM" +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,help:product_logistics_uom.field_product_product__weight +#: model:ir.model.fields,help:product_logistics_uom.field_product_template__weight +msgid "Weight of the product with its container and packaging." +msgstr "" + +#. module: product_logistics_uom +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_product__weight_uom_name +#: model:ir.model.fields,field_description:product_logistics_uom.field_product_template__weight_uom_name +msgid "Weight unit of measure label" +msgstr "" diff --git a/product_logistics_uom/models/__init__.py b/product_logistics_uom/models/__init__.py new file mode 100644 index 00000000000..d15bee9b9cc --- /dev/null +++ b/product_logistics_uom/models/__init__.py @@ -0,0 +1,3 @@ +from . import product_product +from . import product_template +from . import res_config_settings diff --git a/product_logistics_uom/models/product_product.py b/product_logistics_uom/models/product_product.py new file mode 100644 index 00000000000..33a44614aca --- /dev/null +++ b/product_logistics_uom/models/product_product.py @@ -0,0 +1,117 @@ +# Copyright 2023 ACSONE SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +from odoo import api, fields, models +from odoo.tools import float_is_zero + + +class ProductProduct(models.Model): + _inherit = "product.product" + + # remove rounding from volume and weight + # this is needed to avoid rounding errors when converting between units + # and is safe since we display the volume and weight in the product's + # volume and weight UOM. In the same time, we need to keep the volume + # we ensure that no information is lost by storing the volume and weight + # without rounding. + volume = fields.Float(digits=False) + weight = fields.Float(digits=False) + + product_volume = fields.Float( + "Volume in product UOM", + digits="Volume", + help="The volume in the product's volume UOM.", + compute="_compute_product_volume", + inverse="_inverse_product_volume", + ) + product_weight = fields.Float( + "Weight in product UOM", + digits="Stock Weight", + help="The weight in the product's weight UOM.", + compute="_compute_product_weight", + inverse="_inverse_product_weight", + ) + + show_volume_uom_warning = fields.Boolean( + help="Technical field used to warn the user to change the volume" + "uom since the value for product_volume is too small and has been" + "rounded.", + compute="_compute_show_volume_uom_warning", + ) + + show_weight_uom_warning = fields.Boolean( + help="Technical field used to warn the user to change the weight" + "uom since the value for product_weight is too small and has been" + "rounded.", + compute="_compute_show_weight_uom_warning", + ) + + @api.depends("product_volume", "product_tmpl_id.volume_uom_id") + def _compute_product_volume(self): + odoo_volume_uom = ( + self.product_tmpl_id._get_volume_uom_id_from_ir_config_parameter() + ) + for product in self: + product.product_volume = odoo_volume_uom._compute_quantity( + qty=product.volume, + to_unit=product.volume_uom_id, + round=False, # avoid losing information + ) + + def _inverse_product_volume(self): + odoo_volume_uom = ( + self.product_tmpl_id._get_volume_uom_id_from_ir_config_parameter() + ) + for product in self: + product.volume = product.volume_uom_id._compute_quantity( + qty=product.product_volume, + to_unit=odoo_volume_uom, + round=False, # avoid losing information + ) + + @api.depends("product_weight", "product_tmpl_id.weight_uom_id") + def _compute_product_weight(self): + odoo_weight_uom = ( + self.product_tmpl_id._get_weight_uom_id_from_ir_config_parameter() + ) + for product in self: + product.product_weight = odoo_weight_uom._compute_quantity( + qty=product.weight, + to_unit=product.weight_uom_id, + round=False, # avoid losing information + ) + + def _inverse_product_weight(self): + odoo_weight_uom = ( + self.product_tmpl_id._get_weight_uom_id_from_ir_config_parameter() + ) + for product in self: + product.weight = product.weight_uom_id._compute_quantity( + qty=product.product_weight, to_unit=odoo_weight_uom, round=False + ) + + @api.depends("product_volume", "product_tmpl_id.volume_uom_id", "volume") + def _compute_show_volume_uom_warning(self): + odoo_volume_uom = ( + self.product_tmpl_id._get_volume_uom_id_from_ir_config_parameter() + ) + for product in self: + product.show_volume_uom_warning = ( + float_is_zero( + product.product_volume, precision_rounding=odoo_volume_uom.rounding + ) + and product.volume != 0.0 + ) + + @api.depends("product_weight", "product_tmpl_id.weight_uom_id", "weight") + def _compute_show_weight_uom_warning(self): + odoo_weight_uom = ( + self.product_tmpl_id._get_weight_uom_id_from_ir_config_parameter() + ) + for product in self: + product.show_weight_uom_warning = ( + float_is_zero( + product.product_weight, precision_rounding=odoo_weight_uom.rounding + ) + and product.weight != 0.0 + ) diff --git a/product_logistics_uom/models/product_template.py b/product_logistics_uom/models/product_template.py new file mode 100644 index 00000000000..d480962874a --- /dev/null +++ b/product_logistics_uom/models/product_template.py @@ -0,0 +1,141 @@ +# Copyright 2020 Akretion (https://www.akretion.com). +# @author Raphaël Reverdy +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + product_volume = fields.Float( + "Volume in product UOM", + compute="_compute_product_volume", + inverse="_inverse_product_volume", + digits="Volume", + ) + product_weight = fields.Float( + "Weight in product UOM", + compute="_compute_product_weight", + digits="Stock Weight", + inverse="_inverse_product_weight", + store=True, + ) + + # remove rounding from volume and weight + # this is needed to avoid rounding errors when converting between units + # and is safe since we display the volume and weight in the product's + # volume and weight UOM. In the same time, we need to keep the volume + # we ensure that no information is lost by storing the volume and weight + # without rounding. + volume = fields.Float(digits=False) + weight = fields.Float(digits=False) + volume_uom_id = fields.Many2one( + "uom.uom", + string="Volume Unit of Measure", + default=lambda self: self._get_volume_uom_id_from_ir_config_parameter(), + ) + volume_uom_name = fields.Char( + string="Volume unit of measure label", + related="volume_uom_id.name", + ) + + weight_uom_id = fields.Many2one( + "uom.uom", + string="Weight Unit of Measure", + default=lambda self: self._get_weight_uom_id_from_ir_config_parameter(), + ) + + weight_uom_name = fields.Char( + string="Weight unit of measure label", + related="weight_uom_id.name", + ) + + show_volume_uom_warning = fields.Boolean( + help="Technical field used to warn the user to change the volume" + "uom since the value for product_volume is too small and has been" + "rounded.", + compute="_compute_show_volume_uom_warning", + ) + + show_weight_uom_warning = fields.Boolean( + help="Technical field used to warn the user to change the weight" + "uom since the value for product_weight is too small and has been" + "rounded.", + compute="_compute_show_weight_uom_warning", + ) + + @api.model + def _get_volume_uom_id_from_ir_config_parameter(self): + get_param = self.env["ir.config_parameter"].sudo().get_param + default_uom = get_param("product_default_volume_uom_id") + if default_uom: + return self.env["uom.uom"].browse(int(default_uom)) + return super()._get_volume_uom_id_from_ir_config_parameter() + + @api.model + def _get_weight_uom_id_from_ir_config_parameter(self): + get_param = self.env["ir.config_parameter"].sudo().get_param + default_uom = get_param("product_default_weight_uom_id") + if default_uom: + return self.env["uom.uom"].browse(int(default_uom)) + return super()._get_weight_uom_id_from_ir_config_parameter() + + @api.model + def _get_length_uom_id_from_ir_config_parameter(self): + get_param = self.env["ir.config_parameter"].sudo().get_param + default_uom = get_param("product_default_length_uom_id") + if default_uom: + return self.env["uom.uom"].browse(int(default_uom)) + return super()._get_length_uom_id_from_ir_config_parameter() + + @api.depends( + "product_variant_ids", + "product_variant_ids.product_volume", + "volume", + "volume_uom_id", + ) + def _compute_product_volume(self): + for template in self: + template.product_volume = ( + template.product_variant_ids.product_volume + if template.product_variant_count == 1 + else 0.0 + ) + + def _inverse_product_volume(self): + for template in self: + if template.product_variant_count == 1: + template.product_variant_ids.product_volume = template.product_volume + + @api.depends("weight", "weight_uom_id") + def _compute_product_weight(self): + for template in self: + template.product_weight = ( + template.product_variant_ids.product_weight + if template.product_variant_count == 1 + else 0.0 + ) + + def _inverse_product_weight(self): + for template in self: + if template.product_variant_count == 1: + template.product_variant_ids.product_weight = template.product_weight + + @api.depends("volume", "volume_uom_id") + def _compute_show_volume_uom_warning(self): + for template in self: + template.show_volume_uom_warning = ( + template.product_variant_ids.show_volume_uom_warning + if template.product_variant_count == 1 + else False + ) + + @api.depends("weight", "weight_uom_id") + def _compute_show_weight_uom_warning(self): + for template in self: + template.show_weight_uom_warning = ( + template.product_variant_ids.show_weight_uom_warning + if template.product_variant_count == 1 + else False + ) diff --git a/product_logistics_uom/models/res_config_settings.py b/product_logistics_uom/models/res_config_settings.py new file mode 100644 index 00000000000..750da7ab819 --- /dev/null +++ b/product_logistics_uom/models/res_config_settings.py @@ -0,0 +1,30 @@ +# Copyright 2020 Akretion (https://www.akretion.com). +# @author Raphaël Reverdy +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + product_default_weight_uom_id = fields.Many2one( + "uom.uom", + "Default Weight Unit of Measure", + config_parameter="product_default_weight_uom_id", + help="Default unit of measure to express product weight", + ) + + product_default_volume_uom_id = fields.Many2one( + "uom.uom", + "Default Volume Unit of Measure", + config_parameter="product_default_volume_uom_id", + help="Default unit of measure to express product volume", + ) + + product_default_length_uom_id = fields.Many2one( + "uom.uom", + "Default Length Unit of Measure", + config_parameter="product_default_length_uom_id", + help="Default unit of measure to express product length", + ) diff --git a/product_logistics_uom/pyproject.toml b/product_logistics_uom/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/product_logistics_uom/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/product_logistics_uom/readme/CONFIGURE.md b/product_logistics_uom/readme/CONFIGURE.md new file mode 100644 index 00000000000..4ccdafa9900 --- /dev/null +++ b/product_logistics_uom/readme/CONFIGURE.md @@ -0,0 +1,9 @@ +To change the default UoM + +1. Go "General Settings", then in "Products" +2. you have to select a default unit of measure for weights and + volumes. + +To change on a specific product + +1. Go the product form you can change the UoM directly. diff --git a/product_logistics_uom/readme/CONTRIBUTORS.md b/product_logistics_uom/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..20cd012d166 --- /dev/null +++ b/product_logistics_uom/readme/CONTRIBUTORS.md @@ -0,0 +1,6 @@ +- Raphaël Reverdy \<\> +- Fernando La Chica \<\> +- Laurent Mignon \<\> +- Nhan Tran \<\> +- [Studio73](https://www.studio73.es/): + - Eugenio Micó \<\> diff --git a/product_logistics_uom/readme/CREDITS.md b/product_logistics_uom/readme/CREDITS.md new file mode 100644 index 00000000000..54a93de554d --- /dev/null +++ b/product_logistics_uom/readme/CREDITS.md @@ -0,0 +1,4 @@ +The development of this module has been financially supported by: + +- Akretion \<\> +- La Base \<\> diff --git a/product_logistics_uom/readme/DESCRIPTION.md b/product_logistics_uom/readme/DESCRIPTION.md new file mode 100644 index 00000000000..8bc00ef1c7d --- /dev/null +++ b/product_logistics_uom/readme/DESCRIPTION.md @@ -0,0 +1,23 @@ +This module allows to choose an Unit Of Measure (UoM) for products +weight and volume. It can be set product per product for users in +group_uom. + +Without this module, you only have the choice between Kg or Lb(s) and m³ +for all the products. + +For some business cases, you need to express in more precise UoM than +default ones like Liters instead of M³. + +Even if you choose another UoM for the weight or volume, the system will +still store the value for these fields in the Odoo default UoM (Kg or +Lb(s) and m³). This ensures that the arithmetic operations on these +fields are correct and consistent with the rest of the addons. + +Once this addon is installed values stored into the initial Volume and +Weight fields on the product and product template models are no more +rounded to the decimal precision defined for these fields. This could +lead to some side effects into reportss where these fields are used. You +can replace the fields by the new ones provided by this addon to avoid +this problem (product_volume and product_weight). In any cases, since +you use different UoM by product, you should most probably modify your +reportss to display the right UoM. diff --git a/product_logistics_uom/readme/INSTALL.md b/product_logistics_uom/readme/INSTALL.md new file mode 100644 index 00000000000..88e179a32fd --- /dev/null +++ b/product_logistics_uom/readme/INSTALL.md @@ -0,0 +1,4 @@ +Be aware, that this module only change the UoM but not the value. + +It's the same behavior as base Odoo when you change from Metric System +to Imperial System. diff --git a/product_logistics_uom/readme/USAGE.md b/product_logistics_uom/readme/USAGE.md new file mode 100644 index 00000000000..11009e78111 --- /dev/null +++ b/product_logistics_uom/readme/USAGE.md @@ -0,0 +1,9 @@ +Once installed and the 'Sell and purchase products in different units of +measure' option is enabled, the 'Unit of Measure' field will become +updatable on the 'Product' form for users with the permission 'Manage +Multiple Units of Measure'. + +If the displayed value is 0.00 and a warning icon is displayed in front +of the unit of measure, it means that the value is too small to be +displayed in the current unit of measure. You should change the unit of +measure to a larger one to see the value. diff --git a/product_logistics_uom/static/description/icon.png b/product_logistics_uom/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/product_logistics_uom/static/description/icon.png differ diff --git a/product_logistics_uom/static/description/index.html b/product_logistics_uom/static/description/index.html new file mode 100644 index 00000000000..a6668cce537 --- /dev/null +++ b/product_logistics_uom/static/description/index.html @@ -0,0 +1,498 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Product logistics UoM

+ +

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

+

This module allows to choose an Unit Of Measure (UoM) for products +weight and volume. It can be set product per product for users in +group_uom.

+

Without this module, you only have the choice between Kg or Lb(s) and m³ +for all the products.

+

For some business cases, you need to express in more precise UoM than +default ones like Liters instead of M³.

+

Even if you choose another UoM for the weight or volume, the system will +still store the value for these fields in the Odoo default UoM (Kg or +Lb(s) and m³). This ensures that the arithmetic operations on these +fields are correct and consistent with the rest of the addons.

+

Once this addon is installed values stored into the initial Volume and +Weight fields on the product and product template models are no more +rounded to the decimal precision defined for these fields. This could +lead to some side effects into reportss where these fields are used. You +can replace the fields by the new ones provided by this addon to avoid +this problem (product_volume and product_weight). In any cases, since +you use different UoM by product, you should most probably modify your +reportss to display the right UoM.

+

Table of contents

+ +
+

Installation

+

Be aware, that this module only change the UoM but not the value.

+

It’s the same behavior as base Odoo when you change from Metric System +to Imperial System.

+
+
+

Configuration

+

To change the default UoM

+
    +
  1. Go “General Settings”, then in “Products”
  2. +
  3. you have to select a default unit of measure for weights and volumes.
  4. +
+

To change on a specific product

+
    +
  1. Go the product form you can change the UoM directly.
  2. +
+
+
+

Usage

+

Once installed and the ‘Sell and purchase products in different units of +measure’ option is enabled, the ‘Unit of Measure’ field will become +updatable on the ‘Product’ form for users with the permission ‘Manage +Multiple Units of Measure’.

+

If the displayed value is 0.00 and a warning icon is displayed in front +of the unit of measure, it means that the value is too small to be +displayed in the current unit of measure. You should change the unit of +measure to a larger one to see the value.

+
+
+

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

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

Contributors

+ +
+
+

Other credits

+

The development of this module has been financially supported by:

+ +
+
+

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:

+

hparfr

+

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_logistics_uom/tests/__init__.py b/product_logistics_uom/tests/__init__.py new file mode 100644 index 00000000000..7e1a54050dc --- /dev/null +++ b/product_logistics_uom/tests/__init__.py @@ -0,0 +1 @@ +from . import test_product_logistics_uom diff --git a/product_logistics_uom/tests/test_product_logistics_uom.py b/product_logistics_uom/tests/test_product_logistics_uom.py new file mode 100644 index 00000000000..8689bbd738b --- /dev/null +++ b/product_logistics_uom/tests/test_product_logistics_uom.py @@ -0,0 +1,176 @@ +# Copyright 2023 ACSONE SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + + +from unittest.mock import patch + +from odoo.tests.common import TransactionCase + + +class TestProductLogisticsUom(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.product = cls.env["product.product"].create( + { + "name": "Test Product", + } + ) + cls.weigh_uom_kg = cls.env.ref("uom.product_uom_kgm") + cls.weigh_uom_g = cls.env.ref("uom.product_uom_gram") + cls.volume_uom_m3 = cls.env.ref("uom.product_uom_cubic_meter") + cls.volume_uom_l = cls.env.ref("uom.product_uom_litre") + # set volume in m3 and weight in kg + cls.env["ir.config_parameter"].set_param("product.weight_in_lbs", "0") + cls.env["ir.config_parameter"].set_param("product.volume_in_cubic_feet", "0") + cls.length_uom = cls.env["uom.uom"].create({"name": "Meter"}) + cls.env["ir.config_parameter"].set_param( + "product_default_length_uom_id", str(cls.length_uom.id) + ) + cls.product_template = cls.env["product.template"].create( + {"name": "Test Product Template"} + ) + + def test_product_volume(self): + self.product.volume_uom_id = self.volume_uom_l + self.product.volume = 1 + self.assertEqual(self.product.product_volume, 1000) + self.product.product_volume = 10 + self.assertEqual(self.product.volume, 0.01) + self.product.volume_uom_id = self.volume_uom_m3 + self.assertEqual(self.product.product_volume, self.product.volume) + + def test_product_show_product_uom_warning(self): + self.product.volume_uom_id = self.volume_uom_m3 + self.product.volume = 0.0001 + self.assertTrue(self.product.show_volume_uom_warning) + self.product.volume_uom_id = self.volume_uom_l + self.assertFalse(self.product.show_volume_uom_warning) + + def test_product_weight(self): + self.product.weight_uom_id = self.weigh_uom_g + self.product.weight = 1 + self.assertEqual(self.product.product_weight, 1000) + self.product.product_weight = 10 + self.assertEqual(self.product.weight, 0.01) + self.product.weight_uom_id = self.weigh_uom_kg + self.assertEqual(self.product.product_weight, self.product.weight) + + def test_product_show_product_weight_warning(self): + self.product.weight_uom_id = self.weigh_uom_kg + self.product.weight = 0.0001 + self.assertTrue(self.product.show_weight_uom_warning) + self.product.weight_uom_id = self.weigh_uom_g + self.assertFalse(self.product.show_weight_uom_warning) + + def test_template_volume(self): + template = self.product.product_tmpl_id + template.volume_uom_id = self.volume_uom_l + # Volume calculation from product_dimension module has compatibility issue. + with patch( + "odoo.addons.product_dimension.models.product_template.ProductTemplate._calc_volume", + return_value=1, + ): + template.volume = 1 + self.assertEqual(template.product_volume, 1000) + + with patch( + "odoo.addons.product_dimension.models.product_template.ProductTemplate._calc_volume", + return_value=0.01, + ): + template.product_volume = 10 + self.assertEqual(template.volume, 0.01) + template.volume_uom_id = self.volume_uom_m3 + self.assertEqual(template.product_volume, template.volume) + + def test_template_show_volume_uom_warning(self): + template = self.product.product_tmpl_id + template.volume_uom_id = self.volume_uom_m3 + template.volume = 0.0001 + self.assertTrue(template.show_volume_uom_warning) + template.volume_uom_id = self.volume_uom_l + self.assertFalse(template.show_volume_uom_warning) + + def test_template_weight(self): + template = self.product.product_tmpl_id + template.weight_uom_id = self.weigh_uom_g + template.weight = 1 + self.assertEqual(template.product_weight, 1000) + template.product_weight = 10 + self.assertEqual(template.weight, 0.01) + template.weight_uom_id = self.weigh_uom_kg + self.assertEqual(template.product_weight, template.weight) + + def test_template_show_weight_uom_warning(self): + template = self.product.product_tmpl_id + template.weight_uom_id = self.weigh_uom_kg + template.weight = 0.0001 + self.assertTrue(template.show_weight_uom_warning) + template.weight_uom_id = self.weigh_uom_g + self.assertFalse(template.show_weight_uom_warning) + + def test_template_with_variant(self): + variant = self.product.create( + {"name": "Test Variant", "product_tmpl_id": self.product.product_tmpl_id.id} + ) + template = self.product.product_tmpl_id + variant.product_volume = 10 + variant.product_weight = 10 + self.product.product_volume = 10 + self.product.product_weight = 10 + self.assertEqual(template.volume, 0.0) + self.assertEqual(template.volume, 0.0) + self.assertEqual(template.product_volume, 0.0) + self.assertEqual(template.product_weight, 0.0) + self.assertFalse(template.show_volume_uom_warning) # for coverage + self.assertFalse(template.show_weight_uom_warning) # for coverage + variant.unlink() + # Volume calculation from product_dimension module has compatibility issue. + with patch( + "odoo.addons.product_dimension.models.product_template.ProductTemplate._calc_volume", + return_value=10.0, + ): + self.assertEqual(template.volume, 10.0) + self.assertEqual(template.weight, 10.0) + self.assertEqual(template.product_volume, 10.0) + self.assertEqual(template.product_weight, 10.0) + + def test_get_length_uom_id_from_ir_config_parameter(self): + uom = self.product_template._get_length_uom_id_from_ir_config_parameter() + self.assertEqual(uom.id, self.length_uom.id) + + def test_compute_product_volume_single_variant(self): + self.env["ir.config_parameter"].set_param( + "product_default_volume_uom_id", str(self.volume_uom_l.id) + ) + product_template = self.product_template + product_template.product_variant_ids.write( + {"volume": 7.5, "volume_uom_id": self.volume_uom_l.id} + ) + self.assertEqual(product_template.product_volume, 7.5) + + def test_inverse_product_volume_single_variant(self): + self.env["ir.config_parameter"].set_param( + "product_default_weight_uom_id", str(self.weigh_uom_kg.id) + ) + product_template = self.product_template + product_template.product_variant_ids.write( + {"weight": 5.0, "volume_uom_id": self.weigh_uom_kg.id} + ) + product_template.write({"weight": 12.0, "volume_uom_id": self.weigh_uom_kg.id}) + self.assertEqual(product_template.product_variant_ids.product_weight, 12.0) + + # def test_inverse_product_length_single_variant(self): + # # Línea 81: Al cambiar el volumen en el template, se actualiza en la variante + # self.env["ir.config_parameter"].set_param( + # "product_default_length_uom_id", str(self.length_uom.id) + # ) + # product_template = self.product_template + # product_template.product_variant_ids.write( + # {"volume": 5.0, "volume_uom_id": self.length_uom.id} + # ) + # product_template.write( + # {"volume": 12.0, "volume_uom_id": self.length_uom.id} + # ) + # self.assertEqual(product_template.product_variant_ids.product_volume, 12.0) diff --git a/product_logistics_uom/views/product.xml b/product_logistics_uom/views/product.xml new file mode 100644 index 00000000000..b0013b1bd13 --- /dev/null +++ b/product_logistics_uom/views/product.xml @@ -0,0 +1,90 @@ + + + + product.template.common.form + product.template + + + + + 1 + + + + diff --git a/product_logistics_uom/views/res_config_settings.xml b/product_logistics_uom/views/res_config_settings.xml new file mode 100644 index 00000000000..25d4762fd02 --- /dev/null +++ b/product_logistics_uom/views/res_config_settings.xml @@ -0,0 +1,35 @@ + + + + res.config.settings.view.form.inherit.product + res.config.settings + + + + 1 + + + + + + 1 + + + + + + + + + + + + diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 00000000000..61a904ec968 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1 @@ +odoo-addon-product_dimension @ git+https://github.com/OCA/product-attribute.git@refs/pull/2089/head#subdirectory=product_dimension