From 45f2d11806fa7aaf022f6ef86260e8813f497ae3 Mon Sep 17 00:00:00 2001
From: Thierry Ducrest <thierry.ducrest@camptocamp.com>
Date: Thu, 11 Aug 2022 11:37:18 +0200
Subject: [PATCH 01/10] Add delivery_carrier_package_measure_required

This module adds the possibility to flag some measurements on package to be
required for delivery.
---
 .../README.rst                                |  81 ++++
 .../__init__.py                               |   2 +
 .../__manifest__.py                           |  22 +
 ...ivery_carrier_package_measure_required.pot | 153 +++++++
 .../models/__init__.py                        |   3 +
 .../models/product_packaging.py               |  13 +
 .../models/stock_picking.py                   |  21 +
 .../models/stock_quant_package.py             |  38 ++
 .../readme/CONTRIBUTORS.rst                   |   1 +
 .../readme/DESCRIPTION.rst                    |   9 +
 .../static/description/icon.png               | Bin 0 -> 9455 bytes
 .../static/description/index.html             | 423 ++++++++++++++++++
 .../tests/__init__.py                         |   1 +
 ...elivery_carrier_package_measure_require.py |  95 ++++
 .../views/product_packaging.xml               |  21 +
 .../wizard/__init__.py                        |   1 +
 .../wizard/choose_delivery_package.py         |  35 ++
 .../wizard/choose_delivery_package.xml        |  54 +++
 18 files changed, 973 insertions(+)
 create mode 100644 delivery_carrier_package_measure_required/README.rst
 create mode 100644 delivery_carrier_package_measure_required/__init__.py
 create mode 100644 delivery_carrier_package_measure_required/__manifest__.py
 create mode 100644 delivery_carrier_package_measure_required/i18n/delivery_carrier_package_measure_required.pot
 create mode 100644 delivery_carrier_package_measure_required/models/__init__.py
 create mode 100644 delivery_carrier_package_measure_required/models/product_packaging.py
 create mode 100644 delivery_carrier_package_measure_required/models/stock_picking.py
 create mode 100644 delivery_carrier_package_measure_required/models/stock_quant_package.py
 create mode 100644 delivery_carrier_package_measure_required/readme/CONTRIBUTORS.rst
 create mode 100644 delivery_carrier_package_measure_required/readme/DESCRIPTION.rst
 create mode 100644 delivery_carrier_package_measure_required/static/description/icon.png
 create mode 100644 delivery_carrier_package_measure_required/static/description/index.html
 create mode 100644 delivery_carrier_package_measure_required/tests/__init__.py
 create mode 100644 delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py
 create mode 100644 delivery_carrier_package_measure_required/views/product_packaging.xml
 create mode 100644 delivery_carrier_package_measure_required/wizard/__init__.py
 create mode 100644 delivery_carrier_package_measure_required/wizard/choose_delivery_package.py
 create mode 100644 delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml

diff --git a/delivery_carrier_package_measure_required/README.rst b/delivery_carrier_package_measure_required/README.rst
new file mode 100644
index 0000000000..fba20e436e
--- /dev/null
+++ b/delivery_carrier_package_measure_required/README.rst
@@ -0,0 +1,81 @@
+=========================================
+Delivery Carrier Package Measure Required
+=========================================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   !! This file is generated by oca-gen-addon-readme !!
+   !! changes will be overwritten.                   !!
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |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%2Fdelivery--carrier-lightgray.png?logo=github
+    :target: https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required
+    :alt: OCA/delivery-carrier
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+    :target: https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required
+    :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+    :target: https://runbot.odoo-community.org/runbot/99/14.0
+    :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5| 
+
+This module adds the possibility to flag some measurements on package to be required for delivery.
+
+It depends on the `stock_quant_package_dimension` which adds more dimensions on packages.
+
+The required measurement can be flagged on the product packaging.
+
+Then the dimension can be set on the wizard displayed by the Put In Pack button.
+
+A check is also done on transfer validation, to ensure that the required measurements are set.
+
+**Table of contents**
+
+.. contents::
+   :local:
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues <https://github.com/OCA/delivery-carrier/issues>`_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+`feedback <https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Camptocamp
+
+Contributors
+~~~~~~~~~~~~
+
+* Thierry Ducrest <thierry.ducrest@camptocamp.com>
+
+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/delivery-carrier <https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required>`_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/delivery_carrier_package_measure_required/__init__.py b/delivery_carrier_package_measure_required/__init__.py
new file mode 100644
index 0000000000..9b4296142f
--- /dev/null
+++ b/delivery_carrier_package_measure_required/__init__.py
@@ -0,0 +1,2 @@
+from . import models
+from . import wizard
diff --git a/delivery_carrier_package_measure_required/__manifest__.py b/delivery_carrier_package_measure_required/__manifest__.py
new file mode 100644
index 0000000000..451a459ab2
--- /dev/null
+++ b/delivery_carrier_package_measure_required/__manifest__.py
@@ -0,0 +1,22 @@
+{
+    "name": "Delivery Carrier Package Measure Required",
+    "summary": """
+    Allow the configuration of which package measurements are required
+    on a delivery carrier basis.
+    """,
+    "version": "14.0.1.0.0",
+    "license": "AGPL-3",
+    "author": "Camptocamp, Odoo Community Association (OCA)",
+    "website": "https://github.com/OCA/delivery-carrier",
+    "depends": [
+        "stock",
+        "delivery",
+        # OCA/stock-logistics-workflow
+        "stock_quant_package_dimension",
+    ],
+    "data": [
+        "views/product_packaging.xml",
+        "wizard/choose_delivery_package.xml",
+    ],
+    "installable": True,
+}
diff --git a/delivery_carrier_package_measure_required/i18n/delivery_carrier_package_measure_required.pot b/delivery_carrier_package_measure_required/i18n/delivery_carrier_package_measure_required.pot
new file mode 100644
index 0000000000..6cffe1edd9
--- /dev/null
+++ b/delivery_carrier_package_measure_required/i18n/delivery_carrier_package_measure_required.pot
@@ -0,0 +1,153 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# 	* delivery_carrier_package_measure_required
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.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: delivery_carrier_package_measure_required
+#: model_terms:ir.ui.view,arch_db:delivery_carrier_package_measure_required.view_product_packaging_delivery_form_inherit
+msgid "Carrier Required Measurements"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model,name:delivery_carrier_package_measure_required.model_choose_delivery_package
+msgid "Delivery Package Selection Wizard"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__dimension_uom_id
+msgid "Dimension Uom"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__display_name
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__display_name
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_picking__display_name
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_height_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_height_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__height_required
+msgid "Height required"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__id
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__id
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_picking__id
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__id
+msgid "ID"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package____last_update
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging____last_update
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_picking____last_update
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_length_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_length_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__length_required
+msgid "Length required"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_height
+msgid "Package Height"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_length
+msgid "Package Length"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_width
+msgid "Package Width"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model,name:delivery_carrier_package_measure_required.model_stock_quant_package
+msgid "Packages"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model,name:delivery_carrier_package_measure_required.model_product_packaging
+msgid "Product Packaging"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__pick_name
+msgid "Reference"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0
+#, python-format
+msgid ""
+"The measurement(s) [{dimension}] are required on the package {pack_name} and"
+" need to be set."
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model,name:delivery_carrier_package_measure_required.model_stock_picking
+msgid "Transfer"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__dimension_uom_name
+msgid "Unit of Measure"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_weight_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_weight_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__weight_required
+msgid "Weight required"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_width_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_width_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__width_required
+msgid "Width required"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0
+#, python-format
+msgid "height"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0
+#, python-format
+msgid "length"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0
+#, python-format
+msgid "weight"
+msgstr ""
+
+#. module: delivery_carrier_package_measure_required
+#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0
+#, python-format
+msgid "width"
+msgstr ""
diff --git a/delivery_carrier_package_measure_required/models/__init__.py b/delivery_carrier_package_measure_required/models/__init__.py
new file mode 100644
index 0000000000..cb7177dedf
--- /dev/null
+++ b/delivery_carrier_package_measure_required/models/__init__.py
@@ -0,0 +1,3 @@
+from . import product_packaging
+from . import stock_picking
+from . import stock_quant_package
diff --git a/delivery_carrier_package_measure_required/models/product_packaging.py b/delivery_carrier_package_measure_required/models/product_packaging.py
new file mode 100644
index 0000000000..127d8bd8b5
--- /dev/null
+++ b/delivery_carrier_package_measure_required/models/product_packaging.py
@@ -0,0 +1,13 @@
+# Copyright 2022 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+
+from odoo import fields, models
+
+
+class ProductPackaging(models.Model):
+    _inherit = "product.packaging"
+
+    package_height_required = fields.Boolean(string="Height required")
+    package_length_required = fields.Boolean(string="Length required")
+    package_weight_required = fields.Boolean(string="Weight required")
+    package_width_required = fields.Boolean(string="Width required")
diff --git a/delivery_carrier_package_measure_required/models/stock_picking.py b/delivery_carrier_package_measure_required/models/stock_picking.py
new file mode 100644
index 0000000000..0654c14b43
--- /dev/null
+++ b/delivery_carrier_package_measure_required/models/stock_picking.py
@@ -0,0 +1,21 @@
+# Copyright 2022 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+
+from odoo import models
+
+
+class StockPicking(models.Model):
+    _inherit = "stock.picking"
+
+    def _check_required_package_measurement(self):
+        """Check the required measurement on destination pacakges.
+
+        If package is None all result packages on the stock pickings are checked
+        otherwise only the one
+        """
+        packages = self.move_line_ids.mapped("result_package_id")
+        packages._check_required_dimension()
+
+    def button_validate(self):
+        self._check_required_package_measurement()
+        return super().button_validate()
diff --git a/delivery_carrier_package_measure_required/models/stock_quant_package.py b/delivery_carrier_package_measure_required/models/stock_quant_package.py
new file mode 100644
index 0000000000..953606fda4
--- /dev/null
+++ b/delivery_carrier_package_measure_required/models/stock_quant_package.py
@@ -0,0 +1,38 @@
+# Copyright 2022 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+
+from odoo import _, api, fields, models
+from odoo.exceptions import ValidationError
+
+
+class StockQuantPackage(models.Model):
+    _inherit = "stock.quant.package"
+
+    length_required = fields.Boolean(related="packaging_id.package_length_required")
+    width_required = fields.Boolean(related="packaging_id.package_width_required")
+    height_required = fields.Boolean(related="packaging_id.package_height_required")
+    weight_required = fields.Boolean(related="packaging_id.package_weight_required")
+
+    @api.constrains("length", "width", "height", "weight")
+    # The boolean field use to check if a dimension is required are intentionally left out.
+    # To not raise error when changing packaging configuration.
+    def _check_required_dimension(self):
+        for package in self:
+            required_dimension = []
+            if package.length_required and not package.pack_length:
+                required_dimension.append(_("length"))
+            if package.width_required and not package.width:
+                required_dimension.append(_("width"))
+            if package.height_required and not package.height:
+                required_dimension.append(_("height"))
+            if package.weight_required and not package.shipping_weight:
+                required_dimension.append(_("weight"))
+            if required_dimension:
+                raise ValidationError(
+                    _(
+                        "The measurement(s) [{dimension}] are required "
+                        "on the package {pack_name} and need to be set."
+                    ).format(
+                        dimension=", ".join(required_dimension), pack_name=package.name
+                    )
+                )
diff --git a/delivery_carrier_package_measure_required/readme/CONTRIBUTORS.rst b/delivery_carrier_package_measure_required/readme/CONTRIBUTORS.rst
new file mode 100644
index 0000000000..0dd376faec
--- /dev/null
+++ b/delivery_carrier_package_measure_required/readme/CONTRIBUTORS.rst
@@ -0,0 +1 @@
+* Thierry Ducrest <thierry.ducrest@camptocamp.com>
diff --git a/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst b/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst
new file mode 100644
index 0000000000..51666e8352
--- /dev/null
+++ b/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst
@@ -0,0 +1,9 @@
+This module adds the possibility to flag some measurements on package to be required for delivery.
+
+It depends on the `stock_quant_package_dimension` which adds more dimensions on packages.
+
+The required measurement can be flagged on the product packaging.
+
+Then the dimension can be set on the wizard displayed by the Put In Pack button.
+
+A check is also done on transfer validation, to ensure that the required measurements are set.
diff --git a/delivery_carrier_package_measure_required/static/description/icon.png b/delivery_carrier_package_measure_required/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I

literal 0
HcmV?d00001

diff --git a/delivery_carrier_package_measure_required/static/description/index.html b/delivery_carrier_package_measure_required/static/description/index.html
new file mode 100644
index 0000000000..2c099df114
--- /dev/null
+++ b/delivery_carrier_package_measure_required/static/description/index.html
@@ -0,0 +1,423 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
+<title>Delivery Carrier Package Measure Required</title>
+<style type="text/css">
+
+/*
+:Author: David Goodger (goodger@python.org)
+:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+.subscript {
+  vertical-align: sub;
+  font-size: smaller }
+
+.superscript {
+  vertical-align: super;
+  font-size: smaller }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
+  overflow: hidden;
+}
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title, .code .error {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin: 0 0 0.5em 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left, .figure.align-left, object.align-left, table.align-left {
+  clear: left ;
+  float: left ;
+  margin-right: 1em }
+
+img.align-right, .figure.align-right, object.align-right, table.align-right {
+  clear: right ;
+  float: right ;
+  margin-left: 1em }
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+table.align-center {
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+  text-align: left }
+
+.align-center {
+  clear: both ;
+  text-align: center }
+
+.align-right {
+  text-align: right }
+
+/* reset inner alignment in figures */
+div.align-right {
+  text-align: inherit }
+
+/* div.align-center * { */
+/*   text-align: left } */
+
+.align-top    {
+  vertical-align: top }
+
+.align-middle {
+  vertical-align: middle }
+
+.align-bottom {
+  vertical-align: bottom }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font: inherit }
+
+pre.literal-block, pre.doctest-block, pre.math, pre.code {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+pre.code .ln { color: grey; } /* line numbers */
+pre.code, code { background-color: #eeeeee }
+pre.code .comment, code .comment { color: #5C6576 }
+pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
+pre.code .literal.string, code .literal.string { color: #0C5404 }
+pre.code .name.builtin, code .name.builtin { color: #352B84 }
+pre.code .deleted, code .deleted { background-color: #DEB0A1}
+pre.code .inserted, code .inserted { background-color: #A3D289}
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+/* "booktabs" style (no vertical lines) */
+table.docutils.booktabs {
+  border: 0px;
+  border-top: 2px solid;
+  border-bottom: 2px solid;
+  border-collapse: collapse;
+}
+table.docutils.booktabs * {
+  border: 0px;
+}
+table.docutils.booktabs th {
+  border-bottom: thin solid;
+  text-align: left;
+}
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
+
+</style>
+</head>
+<body>
+<div class="document" id="delivery-carrier-package-measure-required">
+<h1 class="title">Delivery Carrier Package Measure Required</h1>
+
+<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!! This file is generated by oca-gen-addon-readme !!
+!! changes will be overwritten.                   !!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/99/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
+<p>This module adds the possibility to flag some measurements on package to be required for delivery.</p>
+<p>It depends on the <cite>stock_quant_package_dimension</cite> which adds more dimensions on packages.</p>
+<p>The required measurement can be flagged on the product packaging.</p>
+<p>Then the dimension can be set on the wizard displayed by the Put In Pack button.</p>
+<p>A check is also done on transfer validation, to ensure that the required measurements are set.</p>
+<p><strong>Table of contents</strong></p>
+<div class="contents local topic" id="contents">
+<ul class="simple">
+<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li>
+<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul>
+<li><a class="reference internal" href="#authors" id="id3">Authors</a></li>
+<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li>
+<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="bug-tracker">
+<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1>
+<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/delivery-carrier/issues">GitHub Issues</a>.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+<a class="reference external" href="https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
+<p>Do not contact contributors directly about support or help with technical issues.</p>
+</div>
+<div class="section" id="credits">
+<h1><a class="toc-backref" href="#id2">Credits</a></h1>
+<div class="section" id="authors">
+<h2><a class="toc-backref" href="#id3">Authors</a></h2>
+<ul class="simple">
+<li>Camptocamp</li>
+</ul>
+</div>
+<div class="section" id="contributors">
+<h2><a class="toc-backref" href="#id4">Contributors</a></h2>
+<ul class="simple">
+<li>Thierry Ducrest &lt;<a class="reference external" href="mailto:thierry.ducrest&#64;camptocamp.com">thierry.ducrest&#64;camptocamp.com</a>&gt;</li>
+</ul>
+</div>
+<div class="section" id="maintainers">
+<h2><a class="toc-backref" href="#id5">Maintainers</a></h2>
+<p>This module is maintained by the OCA.</p>
+<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
+<p>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.</p>
+<p>This module is part of the <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required">OCA/delivery-carrier</a> project on GitHub.</p>
+<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
+</div>
+</div>
+</div>
+</body>
+</html>
diff --git a/delivery_carrier_package_measure_required/tests/__init__.py b/delivery_carrier_package_measure_required/tests/__init__.py
new file mode 100644
index 0000000000..815b653cf9
--- /dev/null
+++ b/delivery_carrier_package_measure_required/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_delivery_carrier_package_measure_require
diff --git a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py
new file mode 100644
index 0000000000..112364f4fe
--- /dev/null
+++ b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py
@@ -0,0 +1,95 @@
+# Copyright 2022 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+
+
+from odoo.exceptions import ValidationError
+
+from odoo.addons.stock.tests.test_packing import TestPackingCommon
+
+
+class TestDeliveryCarrierPackageMeasureRequire(TestPackingCommon):
+    @classmethod
+    def setUpClass(cls):
+        super().setUpClass()
+        cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
+        cls.normal_carrier = cls.env.ref("delivery.normal_delivery_carrier")
+        cls.uom_kg = cls.env.ref("uom.product_uom_kgm")
+        cls.product_aw = cls.env["product.product"].create(
+            {
+                "name": "Product AW",
+                "type": "product",
+                "weight": 2.4,
+                "uom_id": cls.uom_kg.id,
+                "uom_po_id": cls.uom_kg.id,
+            }
+        )
+        cls.packaging = cls.env["product.packaging"].create(
+            {"name": "Test Delivery Packaging"}
+        )
+        cls.env["stock.quant"]._update_available_quantity(
+            cls.product_aw, cls.stock_location, 20.0
+        )
+        cls.pick = cls.env["stock.picking"].create(
+            {
+                "partner_id": cls.env["res.partner"].create({"name": "A partner"}).id,
+                "picking_type_id": cls.warehouse.out_type_id.id,
+                "location_id": cls.stock_location.id,
+                "location_dest_id": cls.customer_location.id,
+                "carrier_id": cls.normal_carrier.id,
+            }
+        )
+        cls.env["stock.move.line"].create(
+            {
+                "product_id": cls.product_aw.id,
+                "product_uom_id": cls.uom_kg.id,
+                "picking_id": cls.pick.id,
+                "qty_done": 5,
+                "location_id": cls.stock_location.id,
+                "location_dest_id": cls.customer_location.id,
+            }
+        )
+        cls.pick.action_confirm()
+
+    def test_required_measurement_are_properly_set(self):
+        """Check required measurement are fullfilled on validation."""
+        pack_action = self.pick.action_put_in_pack()
+        pack_action_ctx = pack_action["context"]
+        pack_wiz = (
+            self.env["choose.delivery.package"].with_context(pack_action_ctx).create({})
+        )
+        pack_wiz.action_put_in_pack()
+        package = self.pick.move_line_ids.mapped("result_package_id")
+        package.packaging_id = self.packaging
+        # No measurement required
+        self.pick._check_required_package_measurement()
+        # Check length is required
+        self.packaging.package_length_required = True
+        with self.assertRaises(ValidationError):
+            self.pick.button_validate()
+        package.pack_length = 55
+        self.pick._check_required_package_measurement()
+        # Check width is required
+        self.packaging.package_width_required = True
+        with self.assertRaises(ValidationError):
+            self.pick._check_required_package_measurement()
+        package.width = 25
+        self.pick._check_required_package_measurement()
+        # Check weight is required
+        self.packaging.package_weight_required = True
+        package.shipping_weight = False
+        with self.assertRaises(ValidationError):
+            self.pick._check_required_package_measurement()
+        package.shipping_weight = 250
+        self.pick._check_required_package_measurement()
+        # Check height is required
+        self.packaging.package_height_required = True
+        with self.assertRaises(ValidationError):
+            self.pick._check_required_package_measurement()
+        package.height = 250
+        self.pick._check_required_package_measurement()
+        # Missing requirement on validate
+        package.width_required = False
+        package.width = False
+        package.width_required = True
+        with self.assertRaises(ValidationError):
+            self.pick.button_validate()
diff --git a/delivery_carrier_package_measure_required/views/product_packaging.xml b/delivery_carrier_package_measure_required/views/product_packaging.xml
new file mode 100644
index 0000000000..12dbe65106
--- /dev/null
+++ b/delivery_carrier_package_measure_required/views/product_packaging.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<odoo>
+    <record id="view_product_packaging_delivery_form_inherit" model="ir.ui.view">
+        <field name="name">product.packaging.form.delivery</field>
+        <field name="model">product.packaging</field>
+        <field name="inherit_id" ref="delivery.product_packaging_delivery_form" />
+        <field name="arch" type="xml">
+            <xpath expr="//group[@name='delivery']" position="inside">
+                        <group
+                    name="carrier_required_mesaurement"
+                    string="Carrier Required Measurements"
+                >
+                            <field name="package_length_required" />
+                            <field name="package_width_required" />
+                            <field name="package_height_required" />
+                            <field name="package_weight_required" />
+                        </group>
+            </xpath>
+        </field>
+    </record>
+</odoo>
diff --git a/delivery_carrier_package_measure_required/wizard/__init__.py b/delivery_carrier_package_measure_required/wizard/__init__.py
new file mode 100644
index 0000000000..9925e2632c
--- /dev/null
+++ b/delivery_carrier_package_measure_required/wizard/__init__.py
@@ -0,0 +1 @@
+from . import choose_delivery_package
diff --git a/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py
new file mode 100644
index 0000000000..5f57f828e2
--- /dev/null
+++ b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py
@@ -0,0 +1,35 @@
+# Copyright 2022 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+
+from odoo import fields, models
+
+
+class ChooseDeliveryPackage(models.TransientModel):
+    _inherit = "choose.delivery.package"
+
+    pick_name = fields.Char(related="picking_id.name")
+
+    def _default_dimension_uom_id(self):
+        val = self.env["product.template"]._get_length_uom_id_from_ir_config_parameter()
+        return val
+
+    package_height = fields.Integer()
+    package_length = fields.Integer()
+    package_width = fields.Integer()
+    dimension_uom_id = fields.Many2one(
+        "uom.uom",
+        default=lambda self: self._default_dimension_uom_id(),
+    )
+    dimension_uom_name = fields.Char(related="dimension_uom_id.name")
+    package_height_required = fields.Boolean(
+        related="delivery_packaging_id.package_height_required"
+    )
+    package_length_required = fields.Boolean(
+        related="delivery_packaging_id.package_length_required"
+    )
+    package_weight_required = fields.Boolean(
+        related="delivery_packaging_id.package_weight_required"
+    )
+    package_width_required = fields.Boolean(
+        related="delivery_packaging_id.package_width_required"
+    )
diff --git a/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml
new file mode 100644
index 0000000000..86b74b5f74
--- /dev/null
+++ b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <record id="choose_delivery_package_view_form" model="ir.ui.view">
+        <field name="name">choose.delivery.package.inherit</field>
+        <field name="model">choose.delivery.package</field>
+        <field name="inherit_id" ref="delivery.choose_delivery_package_view_form" />
+        <field name="arch" type="xml">
+          <xpath expr="//label[@for='shipping_weight']" position="before">
+
+            <field name="package_height_required" invisible="1" />
+            <field name="package_length_required" invisible="1" />
+            <field name="package_weight_required" invisible="1" />
+            <field name="package_width_required" invisible="1" />
+            <label
+                    for="package_length"
+                    attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_length_required', '=', False)]}"
+                />
+            <div
+                    class="o_row"
+                    attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_length_required', '=', False)]}"
+                    name="package_length"
+                >
+              <field name="package_length" />
+              <field name="dimension_uom_name" />
+            </div>
+            <label
+                    for="package_width"
+                    attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_width_required', '=', False)]}"
+                />
+            <div
+                    class="o_row"
+                    attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_width_required', '=', False)]}"
+                    name="package_width"
+                >
+              <field name="package_width" />
+              <field name="dimension_uom_name" />
+            </div>
+            <label
+                    for="package_height"
+                    attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_height_required', '=', False)]}"
+                />
+            <div
+                    class="o_row"
+                    attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_height_required', '=', False)]}"
+                    name="package_height"
+                >
+              <field name="package_height" />
+              <field name="dimension_uom_name" />
+            </div>
+
+          </xpath>
+        </field>
+    </record>
+</odoo>

From c1cd1f8a8912f2d652c9dcb0884339774c3d13bc Mon Sep 17 00:00:00 2001
From: Thierry Ducrest <thierry@ducrest.net>
Date: Fri, 4 Nov 2022 10:31:38 +0100
Subject: [PATCH 02/10] Fix dc_package_measure_required for not done transfer

The required dimensions on a package need not to be enforce before the
picking is being done (package with content).
Because that blocks any preparation on the package before it is
delivered.

But we still want to be able to check if the package is valid at will.
This can be done with the `delivery_pkg_measure__ignore_package_content`
context key.
---
 .../models/stock_quant_package.py             |  8 +++-
 ...elivery_carrier_package_measure_require.py | 42 ++++++++++++-------
 2 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/delivery_carrier_package_measure_required/models/stock_quant_package.py b/delivery_carrier_package_measure_required/models/stock_quant_package.py
index 953606fda4..59eabc54ad 100644
--- a/delivery_carrier_package_measure_required/models/stock_quant_package.py
+++ b/delivery_carrier_package_measure_required/models/stock_quant_package.py
@@ -13,11 +13,17 @@ class StockQuantPackage(models.Model):
     height_required = fields.Boolean(related="packaging_id.package_height_required")
     weight_required = fields.Boolean(related="packaging_id.package_weight_required")
 
-    @api.constrains("length", "width", "height", "weight")
     # The boolean field use to check if a dimension is required are intentionally left out.
     # To not raise error when changing packaging configuration.
+    @api.constrains("length", "width", "height", "weight", "quant_ids")
     def _check_required_dimension(self):
+        ignore_pack_content = self.env.context.get(
+            "delivery_pkg_measure__ignore_package_content"
+        )
         for package in self:
+            if not ignore_pack_content and not package.quant_ids:
+                # Only validate a package when it contains goods
+                continue
             required_dimension = []
             if package.length_required and not package.pack_length:
                 required_dimension.append(_("length"))
diff --git a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py
index 112364f4fe..6d4109e913 100644
--- a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py
+++ b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py
@@ -49,47 +49,59 @@ def setUpClass(cls):
             }
         )
         cls.pick.action_confirm()
-
-    def test_required_measurement_are_properly_set(self):
-        """Check required measurement are fullfilled on validation."""
-        pack_action = self.pick.action_put_in_pack()
+        pack_action = cls.pick.action_put_in_pack()
         pack_action_ctx = pack_action["context"]
         pack_wiz = (
-            self.env["choose.delivery.package"].with_context(pack_action_ctx).create({})
+            cls.env["choose.delivery.package"]
+            .with_context(**pack_action_ctx)
+            .create({})
         )
         pack_wiz.action_put_in_pack()
-        package = self.pick.move_line_ids.mapped("result_package_id")
-        package.packaging_id = self.packaging
+        cls.package = cls.pick.move_line_ids.mapped("result_package_id")
+        cls.package.packaging_id = cls.packaging
+
+    def test_force_check_required_measurement(self):
+        self.packaging.package_length_required = True
+        # Picking is not done no validation error
+        self.pick._check_required_package_measurement()
+        # Force validation error raised
+        pick = self.pick.with_context(delivery_pkg_measure__ignore_package_content=True)
+        with self.assertRaises(ValidationError):
+            pick.button_validate()
+
+    def test_required_measurement_are_properly_set(self):
+        """Check required measurement are fullfilled on done picking."""
+        self.pick._action_done()
         # No measurement required
         self.pick._check_required_package_measurement()
         # Check length is required
         self.packaging.package_length_required = True
         with self.assertRaises(ValidationError):
             self.pick.button_validate()
-        package.pack_length = 55
+        self.package.pack_length = 55
         self.pick._check_required_package_measurement()
         # Check width is required
         self.packaging.package_width_required = True
         with self.assertRaises(ValidationError):
             self.pick._check_required_package_measurement()
-        package.width = 25
+        self.package.width = 25
         self.pick._check_required_package_measurement()
         # Check weight is required
         self.packaging.package_weight_required = True
-        package.shipping_weight = False
+        self.package.shipping_weight = False
         with self.assertRaises(ValidationError):
             self.pick._check_required_package_measurement()
-        package.shipping_weight = 250
+        self.package.shipping_weight = 250
         self.pick._check_required_package_measurement()
         # Check height is required
         self.packaging.package_height_required = True
         with self.assertRaises(ValidationError):
             self.pick._check_required_package_measurement()
-        package.height = 250
+        self.package.height = 250
         self.pick._check_required_package_measurement()
         # Missing requirement on validate
-        package.width_required = False
-        package.width = False
-        package.width_required = True
+        self.package.width_required = False
+        self.package.width = False
+        self.package.width_required = True
         with self.assertRaises(ValidationError):
             self.pick.button_validate()

From 781528f8c5ee674788f92751133a4ccc15730e96 Mon Sep 17 00:00:00 2001
From: OCA-git-bot <oca-git-bot@odoo-community.org>
Date: Thu, 10 Nov 2022 08:24:35 +0000
Subject: [PATCH 03/10] delivery_carrier_package_measure_required 14.0.1.0.1

---
 delivery_carrier_package_measure_required/__manifest__.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/delivery_carrier_package_measure_required/__manifest__.py b/delivery_carrier_package_measure_required/__manifest__.py
index 451a459ab2..02f3ac7a22 100644
--- a/delivery_carrier_package_measure_required/__manifest__.py
+++ b/delivery_carrier_package_measure_required/__manifest__.py
@@ -4,7 +4,7 @@
     Allow the configuration of which package measurements are required
     on a delivery carrier basis.
     """,
-    "version": "14.0.1.0.0",
+    "version": "14.0.1.0.1",
     "license": "AGPL-3",
     "author": "Camptocamp, Odoo Community Association (OCA)",
     "website": "https://github.com/OCA/delivery-carrier",

From c36b17008b1a7fda3644209ed1ec2d20f942ce8c Mon Sep 17 00:00:00 2001
From: Thierry Ducrest <thierry.ducrest@camptocamp.com>
Date: Fri, 7 Jul 2023 10:06:13 +0200
Subject: [PATCH 04/10] dc_package_measure_required: fix warning constrains

---
 .../models/stock_quant_package.py                               | 2 +-
 .../tests/test_delivery_carrier_package_measure_require.py      | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/delivery_carrier_package_measure_required/models/stock_quant_package.py b/delivery_carrier_package_measure_required/models/stock_quant_package.py
index 59eabc54ad..eb966891c6 100644
--- a/delivery_carrier_package_measure_required/models/stock_quant_package.py
+++ b/delivery_carrier_package_measure_required/models/stock_quant_package.py
@@ -15,7 +15,7 @@ class StockQuantPackage(models.Model):
 
     # The boolean field use to check if a dimension is required are intentionally left out.
     # To not raise error when changing packaging configuration.
-    @api.constrains("length", "width", "height", "weight", "quant_ids")
+    @api.constrains("pack_length", "width", "height", "shipping_weight", "quant_ids")
     def _check_required_dimension(self):
         ignore_pack_content = self.env.context.get(
             "delivery_pkg_measure__ignore_package_content"
diff --git a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py
index 6d4109e913..0057beb5e5 100644
--- a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py
+++ b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py
@@ -87,8 +87,8 @@ def test_required_measurement_are_properly_set(self):
         self.package.width = 25
         self.pick._check_required_package_measurement()
         # Check weight is required
-        self.packaging.package_weight_required = True
         self.package.shipping_weight = False
+        self.packaging.package_weight_required = True
         with self.assertRaises(ValidationError):
             self.pick._check_required_package_measurement()
         self.package.shipping_weight = 250

From 4202b4e100d1ae2c149083ca61b8c37ffb0a5fc3 Mon Sep 17 00:00:00 2001
From: OCA-git-bot <oca-git-bot@odoo-community.org>
Date: Mon, 10 Jul 2023 07:13:41 +0000
Subject: [PATCH 05/10] delivery_carrier_package_measure_required 14.0.1.0.2

---
 .../README.rst                                | 15 ++++----
 .../__manifest__.py                           |  2 +-
 .../static/description/index.html             | 34 ++++++++++---------
 3 files changed, 28 insertions(+), 23 deletions(-)

diff --git a/delivery_carrier_package_measure_required/README.rst b/delivery_carrier_package_measure_required/README.rst
index fba20e436e..060b9db388 100644
--- a/delivery_carrier_package_measure_required/README.rst
+++ b/delivery_carrier_package_measure_required/README.rst
@@ -2,10 +2,13 @@
 Delivery Carrier Package Measure Required
 =========================================
 
-.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+.. 
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !! This file is generated by oca-gen-addon-readme !!
    !! changes will be overwritten.                   !!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   !! source digest: sha256:f7777a087ca9e2dd463ad3927a690650f61897e30b010b2bfabb71fa72929165
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
     :target: https://odoo-community.org/page/development-status
@@ -19,11 +22,11 @@ Delivery Carrier Package Measure Required
 .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
     :target: https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required
     :alt: Translate me on Weblate
-.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
-    :target: https://runbot.odoo-community.org/runbot/99/14.0
-    :alt: Try me on Runbot
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+    :target: https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&target_branch=14.0
+    :alt: Try me on Runboat
 
-|badge1| |badge2| |badge3| |badge4| |badge5| 
+|badge1| |badge2| |badge3| |badge4| |badge5|
 
 This module adds the possibility to flag some measurements on package to be required for delivery.
 
@@ -45,7 +48,7 @@ Bug Tracker
 
 Bugs are tracked on `GitHub Issues <https://github.com/OCA/delivery-carrier/issues>`_.
 In case of trouble, please check there if your issue has already been reported.
-If you spotted it first, help us smashing it by providing a detailed and welcomed
+If you spotted it first, help us to smash it by providing a detailed and welcomed
 `feedback <https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
 
 Do not contact contributors directly about support or help with technical issues.
diff --git a/delivery_carrier_package_measure_required/__manifest__.py b/delivery_carrier_package_measure_required/__manifest__.py
index 02f3ac7a22..fa9a340b1e 100644
--- a/delivery_carrier_package_measure_required/__manifest__.py
+++ b/delivery_carrier_package_measure_required/__manifest__.py
@@ -4,7 +4,7 @@
     Allow the configuration of which package measurements are required
     on a delivery carrier basis.
     """,
-    "version": "14.0.1.0.1",
+    "version": "14.0.1.0.2",
     "license": "AGPL-3",
     "author": "Camptocamp, Odoo Community Association (OCA)",
     "website": "https://github.com/OCA/delivery-carrier",
diff --git a/delivery_carrier_package_measure_required/static/description/index.html b/delivery_carrier_package_measure_required/static/description/index.html
index 2c099df114..eb7d0c4595 100644
--- a/delivery_carrier_package_measure_required/static/description/index.html
+++ b/delivery_carrier_package_measure_required/static/description/index.html
@@ -1,20 +1,20 @@
-<?xml version="1.0" encoding="utf-8" ?>
+<?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
 <title>Delivery Carrier Package Measure Required</title>
 <style type="text/css">
 
 /*
 :Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
+:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
 :Copyright: This stylesheet has been placed in the public domain.
 
 Default cascading style sheet for the HTML output of Docutils.
 
-See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
 customize this style sheet.
 */
 
@@ -366,8 +366,10 @@ <h1 class="title">Delivery Carrier Package Measure Required</h1>
 <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !! This file is generated by oca-gen-addon-readme !!
 !! changes will be overwritten.                   !!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!! source digest: sha256:f7777a087ca9e2dd463ad3927a690650f61897e30b010b2bfabb71fa72929165
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/99/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
+<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&amp;target_branch=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
 <p>This module adds the possibility to flag some measurements on package to be required for delivery.</p>
 <p>It depends on the <cite>stock_quant_package_dimension</cite> which adds more dimensions on packages.</p>
 <p>The required measurement can be flagged on the product packaging.</p>
@@ -376,39 +378,39 @@ <h1 class="title">Delivery Carrier Package Measure Required</h1>
 <p><strong>Table of contents</strong></p>
 <div class="contents local topic" id="contents">
 <ul class="simple">
-<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li>
-<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul>
-<li><a class="reference internal" href="#authors" id="id3">Authors</a></li>
-<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li>
-<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
+<li><a class="reference internal" href="#bug-tracker" id="toc-entry-1">Bug Tracker</a></li>
+<li><a class="reference internal" href="#credits" id="toc-entry-2">Credits</a><ul>
+<li><a class="reference internal" href="#authors" id="toc-entry-3">Authors</a></li>
+<li><a class="reference internal" href="#contributors" id="toc-entry-4">Contributors</a></li>
+<li><a class="reference internal" href="#maintainers" id="toc-entry-5">Maintainers</a></li>
 </ul>
 </li>
 </ul>
 </div>
 <div class="section" id="bug-tracker">
-<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1>
+<h1><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h1>
 <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/delivery-carrier/issues">GitHub Issues</a>.
 In case of trouble, please check there if your issue has already been reported.
-If you spotted it first, help us smashing it by providing a detailed and welcomed
+If you spotted it first, help us to smash it by providing a detailed and welcomed
 <a class="reference external" href="https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
 <p>Do not contact contributors directly about support or help with technical issues.</p>
 </div>
 <div class="section" id="credits">
-<h1><a class="toc-backref" href="#id2">Credits</a></h1>
+<h1><a class="toc-backref" href="#toc-entry-2">Credits</a></h1>
 <div class="section" id="authors">
-<h2><a class="toc-backref" href="#id3">Authors</a></h2>
+<h2><a class="toc-backref" href="#toc-entry-3">Authors</a></h2>
 <ul class="simple">
 <li>Camptocamp</li>
 </ul>
 </div>
 <div class="section" id="contributors">
-<h2><a class="toc-backref" href="#id4">Contributors</a></h2>
+<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
 <ul class="simple">
 <li>Thierry Ducrest &lt;<a class="reference external" href="mailto:thierry.ducrest&#64;camptocamp.com">thierry.ducrest&#64;camptocamp.com</a>&gt;</li>
 </ul>
 </div>
 <div class="section" id="maintainers">
-<h2><a class="toc-backref" href="#id5">Maintainers</a></h2>
+<h2><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h2>
 <p>This module is maintained by the OCA.</p>
 <a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
 <p>OCA, or the Odoo Community Association, is a nonprofit organization whose

From 299caf6812f54c3ab44dcd790ab4b0190798a2cb Mon Sep 17 00:00:00 2001
From: FranciscoFactorLibre <francisco.santos@factorlibre.com>
Date: Mon, 18 Sep 2023 08:25:01 +0000
Subject: [PATCH 06/10] Added translation using Weblate (Spanish)

---
 .../i18n/es.po                                | 158 ++++++++++++++++++
 1 file changed, 158 insertions(+)
 create mode 100644 delivery_carrier_package_measure_required/i18n/es.po

diff --git a/delivery_carrier_package_measure_required/i18n/es.po b/delivery_carrier_package_measure_required/i18n/es.po
new file mode 100644
index 0000000000..985e3eb2d0
--- /dev/null
+++ b/delivery_carrier_package_measure_required/i18n/es.po
@@ -0,0 +1,158 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# 	* delivery_carrier_package_measure_required
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2023-09-18 08:34+0000\n"
+"Last-Translator: FranciscoFactorLibre <francisco.santos@factorlibre.com>\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: delivery_carrier_package_measure_required
+#: model_terms:ir.ui.view,arch_db:delivery_carrier_package_measure_required.view_product_packaging_delivery_form_inherit
+msgid "Carrier Required Measurements"
+msgstr "Medidas requeridas por el transportista"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model,name:delivery_carrier_package_measure_required.model_choose_delivery_package
+msgid "Delivery Package Selection Wizard"
+msgstr "Asistente selección paquete para el envío"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__dimension_uom_id
+msgid "Dimension Uom"
+msgstr "Dimensión Uom"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__display_name
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__display_name
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_picking__display_name
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__display_name
+msgid "Display Name"
+msgstr "Nombre mostrado"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_height_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_height_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__height_required
+msgid "Height required"
+msgstr "Necesario altura"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__id
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__id
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_picking__id
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__id
+msgid "ID"
+msgstr "ID"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package____last_update
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging____last_update
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_picking____last_update
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package____last_update
+msgid "Last Modified on"
+msgstr "Ultima modificación en"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_length_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_length_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__length_required
+msgid "Length required"
+msgstr "Necesaria longitud"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_height
+msgid "Package Height"
+msgstr "Altura del paquete"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_length
+msgid "Package Length"
+msgstr "Longitud del paquete"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_width
+msgid "Package Width"
+msgstr "Ancho del paquete"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model,name:delivery_carrier_package_measure_required.model_stock_quant_package
+msgid "Packages"
+msgstr "Paquetes"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model,name:delivery_carrier_package_measure_required.model_product_packaging
+msgid "Product Packaging"
+msgstr "Empaquetado del producto"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__pick_name
+msgid "Reference"
+msgstr "Referencia"
+
+#. module: delivery_carrier_package_measure_required
+#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0
+#, python-format
+msgid ""
+"The measurement(s) [{dimension}] are required on the package {pack_name} and"
+" need to be set."
+msgstr ""
+"La medida(s) [{dimension}] son requeridas para el paquete {pack_name} y "
+"deben configurarse."
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model,name:delivery_carrier_package_measure_required.model_stock_picking
+msgid "Transfer"
+msgstr "Transferir"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__dimension_uom_name
+msgid "Unit of Measure"
+msgstr "Unidad de medida"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_weight_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_weight_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__weight_required
+msgid "Weight required"
+msgstr "Necesario peso"
+
+#. module: delivery_carrier_package_measure_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_choose_delivery_package__package_width_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_product_packaging__package_width_required
+#: model:ir.model.fields,field_description:delivery_carrier_package_measure_required.field_stock_quant_package__width_required
+msgid "Width required"
+msgstr "Necesario ancho"
+
+#. module: delivery_carrier_package_measure_required
+#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0
+#, python-format
+msgid "height"
+msgstr "Altura"
+
+#. module: delivery_carrier_package_measure_required
+#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0
+#, python-format
+msgid "length"
+msgstr "Longitud"
+
+#. module: delivery_carrier_package_measure_required
+#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0
+#, python-format
+msgid "weight"
+msgstr "Peso"
+
+#. module: delivery_carrier_package_measure_required
+#: code:addons/delivery_carrier_package_measure_required/models/stock_quant_package.py:0
+#, python-format
+msgid "width"
+msgstr "Ancho"

From 5f13364b96a10fc9115607e0b3eca6b25b15ebf0 Mon Sep 17 00:00:00 2001
From: Rodrigo <rodrigo.bonilla@factorlibre.com>
Date: Mon, 2 Oct 2023 13:17:15 +0200
Subject: [PATCH 07/10] [IMP] delivery_carrier_package_measure_required:
 pre-commit stuff

---
 .../odoo/addons/delivery_carrier_package_measure_required   | 1 +
 setup/delivery_carrier_package_measure_required/setup.py    | 6 ++++++
 2 files changed, 7 insertions(+)
 create mode 120000 setup/delivery_carrier_package_measure_required/odoo/addons/delivery_carrier_package_measure_required
 create mode 100644 setup/delivery_carrier_package_measure_required/setup.py

diff --git a/setup/delivery_carrier_package_measure_required/odoo/addons/delivery_carrier_package_measure_required b/setup/delivery_carrier_package_measure_required/odoo/addons/delivery_carrier_package_measure_required
new file mode 120000
index 0000000000..fb062084af
--- /dev/null
+++ b/setup/delivery_carrier_package_measure_required/odoo/addons/delivery_carrier_package_measure_required
@@ -0,0 +1 @@
+../../../../delivery_carrier_package_measure_required
\ No newline at end of file
diff --git a/setup/delivery_carrier_package_measure_required/setup.py b/setup/delivery_carrier_package_measure_required/setup.py
new file mode 100644
index 0000000000..28c57bb640
--- /dev/null
+++ b/setup/delivery_carrier_package_measure_required/setup.py
@@ -0,0 +1,6 @@
+import setuptools
+
+setuptools.setup(
+    setup_requires=['setuptools-odoo'],
+    odoo_addon=True,
+)

From ba9257937012837618da594b644d60522a04b304 Mon Sep 17 00:00:00 2001
From: Rodrigo <rodrigo.bonilla@factorlibre.com>
Date: Tue, 3 Oct 2023 13:44:31 +0200
Subject: [PATCH 08/10] [MIG] delivery_carrier_package_measure_required:
 Migration to 16.0"

---
 .../README.rst                                | 12 ++--
 .../__manifest__.py                           |  4 +-
 .../models/__init__.py                        |  2 +-
 ...uct_packaging.py => stock_package_type.py} |  4 +-
 .../models/stock_quant_package.py             |  8 +--
 .../readme/DESCRIPTION.rst                    |  2 +-
 .../static/description/index.html             |  9 ++-
 ...elivery_carrier_package_measure_require.py | 17 +++---
 .../views/product_packaging.xml               | 21 -------
 .../views/stock_package_type_views.xml        | 21 +++++++
 .../wizard/choose_delivery_package.py         | 58 +++++++++++++------
 .../wizard/choose_delivery_package.xml        | 12 ++--
 12 files changed, 97 insertions(+), 73 deletions(-)
 rename delivery_carrier_package_measure_required/models/{product_packaging.py => stock_package_type.py} (84%)
 delete mode 100644 delivery_carrier_package_measure_required/views/product_packaging.xml
 create mode 100644 delivery_carrier_package_measure_required/views/stock_package_type_views.xml

diff --git a/delivery_carrier_package_measure_required/README.rst b/delivery_carrier_package_measure_required/README.rst
index 060b9db388..8cf92214e7 100644
--- a/delivery_carrier_package_measure_required/README.rst
+++ b/delivery_carrier_package_measure_required/README.rst
@@ -17,13 +17,13 @@ Delivery Carrier Package Measure Required
     :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
     :alt: License: AGPL-3
 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github
-    :target: https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required
+    :target: https://github.com/OCA/delivery-carrier/tree/16.0/delivery_carrier_package_measure_required
     :alt: OCA/delivery-carrier
 .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
-    :target: https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required
+    :target: https://translation.odoo-community.org/projects/delivery-carrier-16-0/delivery-carrier-16-0-delivery_carrier_package_measure_required
     :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/delivery-carrier&target_branch=14.0
+    :target: https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&target_branch=16.0
     :alt: Try me on Runboat
 
 |badge1| |badge2| |badge3| |badge4| |badge5|
@@ -32,7 +32,7 @@ This module adds the possibility to flag some measurements on package to be requ
 
 It depends on the `stock_quant_package_dimension` which adds more dimensions on packages.
 
-The required measurement can be flagged on the product packaging.
+The required measurement can be flagged on the package type.
 
 Then the dimension can be set on the wizard displayed by the Put In Pack button.
 
@@ -49,7 +49,7 @@ Bug Tracker
 Bugs are tracked on `GitHub Issues <https://github.com/OCA/delivery-carrier/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 <https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
+`feedback <https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
 
 Do not contact contributors directly about support or help with technical issues.
 
@@ -79,6 +79,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/delivery-carrier <https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required>`_ project on GitHub.
+This module is part of the `OCA/delivery-carrier <https://github.com/OCA/delivery-carrier/tree/16.0/delivery_carrier_package_measure_required>`_ project on GitHub.
 
 You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/delivery_carrier_package_measure_required/__manifest__.py b/delivery_carrier_package_measure_required/__manifest__.py
index fa9a340b1e..d6c81469b2 100644
--- a/delivery_carrier_package_measure_required/__manifest__.py
+++ b/delivery_carrier_package_measure_required/__manifest__.py
@@ -4,7 +4,7 @@
     Allow the configuration of which package measurements are required
     on a delivery carrier basis.
     """,
-    "version": "14.0.1.0.2",
+    "version": "16.0.1.0.0",
     "license": "AGPL-3",
     "author": "Camptocamp, Odoo Community Association (OCA)",
     "website": "https://github.com/OCA/delivery-carrier",
@@ -15,7 +15,7 @@
         "stock_quant_package_dimension",
     ],
     "data": [
-        "views/product_packaging.xml",
+        "views/stock_package_type_views.xml",
         "wizard/choose_delivery_package.xml",
     ],
     "installable": True,
diff --git a/delivery_carrier_package_measure_required/models/__init__.py b/delivery_carrier_package_measure_required/models/__init__.py
index cb7177dedf..2f66e4bb1d 100644
--- a/delivery_carrier_package_measure_required/models/__init__.py
+++ b/delivery_carrier_package_measure_required/models/__init__.py
@@ -1,3 +1,3 @@
-from . import product_packaging
+from . import stock_package_type
 from . import stock_picking
 from . import stock_quant_package
diff --git a/delivery_carrier_package_measure_required/models/product_packaging.py b/delivery_carrier_package_measure_required/models/stock_package_type.py
similarity index 84%
rename from delivery_carrier_package_measure_required/models/product_packaging.py
rename to delivery_carrier_package_measure_required/models/stock_package_type.py
index 127d8bd8b5..a63d7afdc7 100644
--- a/delivery_carrier_package_measure_required/models/product_packaging.py
+++ b/delivery_carrier_package_measure_required/models/stock_package_type.py
@@ -4,8 +4,8 @@
 from odoo import fields, models
 
 
-class ProductPackaging(models.Model):
-    _inherit = "product.packaging"
+class StockPackageType(models.Model):
+    _inherit = "stock.package.type"
 
     package_height_required = fields.Boolean(string="Height required")
     package_length_required = fields.Boolean(string="Length required")
diff --git a/delivery_carrier_package_measure_required/models/stock_quant_package.py b/delivery_carrier_package_measure_required/models/stock_quant_package.py
index eb966891c6..c3ebdb3582 100644
--- a/delivery_carrier_package_measure_required/models/stock_quant_package.py
+++ b/delivery_carrier_package_measure_required/models/stock_quant_package.py
@@ -8,10 +8,10 @@
 class StockQuantPackage(models.Model):
     _inherit = "stock.quant.package"
 
-    length_required = fields.Boolean(related="packaging_id.package_length_required")
-    width_required = fields.Boolean(related="packaging_id.package_width_required")
-    height_required = fields.Boolean(related="packaging_id.package_height_required")
-    weight_required = fields.Boolean(related="packaging_id.package_weight_required")
+    length_required = fields.Boolean(related="package_type_id.package_length_required")
+    width_required = fields.Boolean(related="package_type_id.package_width_required")
+    height_required = fields.Boolean(related="package_type_id.package_height_required")
+    weight_required = fields.Boolean(related="package_type_id.package_weight_required")
 
     # The boolean field use to check if a dimension is required are intentionally left out.
     # To not raise error when changing packaging configuration.
diff --git a/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst b/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst
index 51666e8352..e2db95e6c3 100644
--- a/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst
+++ b/delivery_carrier_package_measure_required/readme/DESCRIPTION.rst
@@ -2,7 +2,7 @@ This module adds the possibility to flag some measurements on package to be requ
 
 It depends on the `stock_quant_package_dimension` which adds more dimensions on packages.
 
-The required measurement can be flagged on the product packaging.
+The required measurement can be flagged on the package type.
 
 Then the dimension can be set on the wizard displayed by the Put In Pack button.
 
diff --git a/delivery_carrier_package_measure_required/static/description/index.html b/delivery_carrier_package_measure_required/static/description/index.html
index eb7d0c4595..6c4be40020 100644
--- a/delivery_carrier_package_measure_required/static/description/index.html
+++ b/delivery_carrier_package_measure_required/static/description/index.html
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
@@ -369,10 +368,10 @@ <h1 class="title">Delivery Carrier Package Measure Required</h1>
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !! source digest: sha256:f7777a087ca9e2dd463ad3927a690650f61897e30b010b2bfabb71fa72929165
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_carrier_package_measure_required"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&amp;target_branch=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
+<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/delivery-carrier/tree/16.0/delivery_carrier_package_measure_required"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/delivery-carrier-16-0/delivery-carrier-16-0-delivery_carrier_package_measure_required"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
 <p>This module adds the possibility to flag some measurements on package to be required for delivery.</p>
 <p>It depends on the <cite>stock_quant_package_dimension</cite> which adds more dimensions on packages.</p>
-<p>The required measurement can be flagged on the product packaging.</p>
+<p>The required measurement can be flagged on the package type.</p>
 <p>Then the dimension can be set on the wizard displayed by the Put In Pack button.</p>
 <p>A check is also done on transfer validation, to ensure that the required measurements are set.</p>
 <p><strong>Table of contents</strong></p>
@@ -392,7 +391,7 @@ <h1><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h1>
 <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/delivery-carrier/issues">GitHub Issues</a>.
 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
-<a class="reference external" href="https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
+<a class="reference external" href="https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_carrier_package_measure_required%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
 <p>Do not contact contributors directly about support or help with technical issues.</p>
 </div>
 <div class="section" id="credits">
@@ -416,7 +415,7 @@ <h2><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h2>
 <p>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.</p>
-<p>This module is part of the <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_carrier_package_measure_required">OCA/delivery-carrier</a> project on GitHub.</p>
+<p>This module is part of the <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/16.0/delivery_carrier_package_measure_required">OCA/delivery-carrier</a> project on GitHub.</p>
 <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
 </div>
 </div>
diff --git a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py
index 0057beb5e5..10defee53d 100644
--- a/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py
+++ b/delivery_carrier_package_measure_required/tests/test_delivery_carrier_package_measure_require.py
@@ -12,7 +12,7 @@ class TestDeliveryCarrierPackageMeasureRequire(TestPackingCommon):
     def setUpClass(cls):
         super().setUpClass()
         cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
-        cls.normal_carrier = cls.env.ref("delivery.normal_delivery_carrier")
+        cls.normal_carrier = cls.env.ref("delivery.free_delivery_carrier")
         cls.uom_kg = cls.env.ref("uom.product_uom_kgm")
         cls.product_aw = cls.env["product.product"].create(
             {
@@ -23,7 +23,7 @@ def setUpClass(cls):
                 "uom_po_id": cls.uom_kg.id,
             }
         )
-        cls.packaging = cls.env["product.packaging"].create(
+        cls.packaging = cls.env["stock.package.type"].create(
             {"name": "Test Delivery Packaging"}
         )
         cls.env["stock.quant"]._update_available_quantity(
@@ -38,12 +38,13 @@ def setUpClass(cls):
                 "carrier_id": cls.normal_carrier.id,
             }
         )
-        cls.env["stock.move.line"].create(
+        cls.env["stock.move"].create(
             {
+                "name": cls.product_aw.name,
                 "product_id": cls.product_aw.id,
-                "product_uom_id": cls.uom_kg.id,
+                "product_uom_qty": 5,
+                "product_uom": cls.uom_kg.id,
                 "picking_id": cls.pick.id,
-                "qty_done": 5,
                 "location_id": cls.stock_location.id,
                 "location_dest_id": cls.customer_location.id,
             }
@@ -58,14 +59,16 @@ def setUpClass(cls):
         )
         pack_wiz.action_put_in_pack()
         cls.package = cls.pick.move_line_ids.mapped("result_package_id")
-        cls.package.packaging_id = cls.packaging
+        cls.package.package_type_id = cls.packaging
 
     def test_force_check_required_measurement(self):
         self.packaging.package_length_required = True
         # Picking is not done no validation error
         self.pick._check_required_package_measurement()
         # Force validation error raised
-        pick = self.pick.with_context(delivery_pkg_measure__ignore_package_content=True)
+        pick = self.pick.with_context(
+            delivery_pkg_measure__force_validation_package=True
+        )
         with self.assertRaises(ValidationError):
             pick.button_validate()
 
diff --git a/delivery_carrier_package_measure_required/views/product_packaging.xml b/delivery_carrier_package_measure_required/views/product_packaging.xml
deleted file mode 100644
index 12dbe65106..0000000000
--- a/delivery_carrier_package_measure_required/views/product_packaging.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<odoo>
-    <record id="view_product_packaging_delivery_form_inherit" model="ir.ui.view">
-        <field name="name">product.packaging.form.delivery</field>
-        <field name="model">product.packaging</field>
-        <field name="inherit_id" ref="delivery.product_packaging_delivery_form" />
-        <field name="arch" type="xml">
-            <xpath expr="//group[@name='delivery']" position="inside">
-                        <group
-                    name="carrier_required_mesaurement"
-                    string="Carrier Required Measurements"
-                >
-                            <field name="package_length_required" />
-                            <field name="package_width_required" />
-                            <field name="package_height_required" />
-                            <field name="package_weight_required" />
-                        </group>
-            </xpath>
-        </field>
-    </record>
-</odoo>
diff --git a/delivery_carrier_package_measure_required/views/stock_package_type_views.xml b/delivery_carrier_package_measure_required/views/stock_package_type_views.xml
new file mode 100644
index 0000000000..0431ecd9e9
--- /dev/null
+++ b/delivery_carrier_package_measure_required/views/stock_package_type_views.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<odoo>
+    <record id="view_stock_package_type_form_delivery_inherit" model="ir.ui.view">
+        <field name="name">stock.package.type.form.delivery</field>
+        <field name="model">stock.package.type</field>
+        <field name="inherit_id" ref="delivery.stock_package_type_form_delivery" />
+        <field name="arch" type="xml">
+            <xpath expr="//group[@name='delivery']" position="inside">
+                <group
+                    name="carrier_required_mesaurement"
+                    string="Carrier Required Measurements"
+                >
+                    <field name="package_length_required" />
+                    <field name="package_width_required" />
+                    <field name="package_height_required" />
+                    <field name="package_weight_required" />
+                </group>
+            </xpath>
+        </field>
+    </record>
+</odoo>
diff --git a/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py
index 5f57f828e2..6c78a2fc5b 100644
--- a/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py
+++ b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.py
@@ -1,35 +1,57 @@
 # Copyright 2022 Camptocamp SA
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
 
-from odoo import fields, models
+from odoo import api, fields, models
 
 
 class ChooseDeliveryPackage(models.TransientModel):
     _inherit = "choose.delivery.package"
 
-    pick_name = fields.Char(related="picking_id.name")
+    @api.depends("delivery_package_type_id")
+    def _compute_dimension_uom_name(self):
+        length_uom_id = self.env[
+            "product.template"
+        ]._get_length_uom_id_from_ir_config_parameter()
+        for package in self:
+            package.dimension_uom_name = length_uom_id.name
 
-    def _default_dimension_uom_id(self):
-        val = self.env["product.template"]._get_length_uom_id_from_ir_config_parameter()
-        return val
+    @api.depends("delivery_package_type_id")
+    def _compute_dimension(self):
+        for package in self:
+            package.package_length = (
+                package.delivery_package_type_id.packaging_length or 0
+            )
+            package.package_width = package.delivery_package_type_id.width or 0
+            package.package_height = package.delivery_package_type_id.height or 0
 
-    package_height = fields.Integer()
-    package_length = fields.Integer()
-    package_width = fields.Integer()
-    dimension_uom_id = fields.Many2one(
-        "uom.uom",
-        default=lambda self: self._default_dimension_uom_id(),
+    package_length = fields.Integer(
+        compute="_compute_dimension", store=True, readonly=False
     )
-    dimension_uom_name = fields.Char(related="dimension_uom_id.name")
+    package_width = fields.Integer(
+        compute="_compute_dimension", store=True, readonly=False
+    )
+    package_height = fields.Integer(
+        compute="_compute_dimension", store=True, readonly=False
+    )
+    dimension_uom_name = fields.Char(compute="_compute_dimension_uom_name")
     package_height_required = fields.Boolean(
-        related="delivery_packaging_id.package_height_required"
+        related="delivery_package_type_id.package_height_required"
     )
     package_length_required = fields.Boolean(
-        related="delivery_packaging_id.package_length_required"
-    )
-    package_weight_required = fields.Boolean(
-        related="delivery_packaging_id.package_weight_required"
+        related="delivery_package_type_id.package_length_required"
     )
     package_width_required = fields.Boolean(
-        related="delivery_packaging_id.package_width_required"
+        related="delivery_package_type_id.package_width_required"
     )
+    package_weight_required = fields.Boolean(
+        related="delivery_package_type_id.package_weight_required"
+    )
+
+    def action_put_in_pack(self):
+        self = self.with_context(
+            choose_delivery_package_length=self.package_length,
+            choose_delivery_package_width=self.package_width,
+            choose_delivery_package_height=self.package_height,
+            choose_delivery_package_pack_weight=self.shipping_weight,
+        )
+        return super().action_put_in_pack()
diff --git a/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml
index 86b74b5f74..d31f38ef1d 100644
--- a/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml
+++ b/delivery_carrier_package_measure_required/wizard/choose_delivery_package.xml
@@ -13,11 +13,11 @@
             <field name="package_width_required" invisible="1" />
             <label
                     for="package_length"
-                    attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_length_required', '=', False)]}"
+                    attrs="{'invisible': ['|', ('delivery_package_type_id', '=', False), ('package_length_required', '=', False)]}"
                 />
             <div
                     class="o_row"
-                    attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_length_required', '=', False)]}"
+                    attrs="{'invisible': ['|', ('delivery_package_type_id', '=', False), ('package_length_required', '=', False)]}"
                     name="package_length"
                 >
               <field name="package_length" />
@@ -25,11 +25,11 @@
             </div>
             <label
                     for="package_width"
-                    attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_width_required', '=', False)]}"
+                    attrs="{'invisible': ['|', ('delivery_package_type_id', '=', False), ('package_width_required', '=', False)]}"
                 />
             <div
                     class="o_row"
-                    attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_width_required', '=', False)]}"
+                    attrs="{'invisible': ['|', ('delivery_package_type_id', '=', False), ('package_width_required', '=', False)]}"
                     name="package_width"
                 >
               <field name="package_width" />
@@ -37,11 +37,11 @@
             </div>
             <label
                     for="package_height"
-                    attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_height_required', '=', False)]}"
+                    attrs="{'invisible': ['|', ('delivery_package_type_id', '=', False), ('package_height_required', '=', False)]}"
                 />
             <div
                     class="o_row"
-                    attrs="{'invisible': ['|', ('delivery_packaging_id', '=', False), ('package_height_required', '=', False)]}"
+                    attrs="{'invisible': ['|', ('delivery_package_type_id', '=', False), ('package_height_required', '=', False)]}"
                     name="package_height"
                 >
               <field name="package_height" />

From 9d544d6b598ae0c026295e859b91af2b3ff7046a Mon Sep 17 00:00:00 2001
From: Rodrigo <rodrigo.bonilla@factorlibre.com>
Date: Wed, 22 May 2024 15:32:59 +0200
Subject: [PATCH 09/10] [IMP] delivery_carrier_package_measure_required: put in
 pack

add measures to package when you add producto to pack.
---
 .../models/stock_picking.py                   | 26 +++++++++++++++----
 1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/delivery_carrier_package_measure_required/models/stock_picking.py b/delivery_carrier_package_measure_required/models/stock_picking.py
index 0654c14b43..2adc07ed75 100644
--- a/delivery_carrier_package_measure_required/models/stock_picking.py
+++ b/delivery_carrier_package_measure_required/models/stock_picking.py
@@ -8,14 +8,30 @@ class StockPicking(models.Model):
     _inherit = "stock.picking"
 
     def _check_required_package_measurement(self):
-        """Check the required measurement on destination pacakges.
-
-        If package is None all result packages on the stock pickings are checked
-        otherwise only the one
-        """
+        """Check the required measurement on destination pacakges."""
         packages = self.move_line_ids.mapped("result_package_id")
         packages._check_required_dimension()
 
     def button_validate(self):
         self._check_required_package_measurement()
         return super().button_validate()
+
+    def _put_in_pack(self, move_line_ids, create_package_level=True):
+        res = super()._put_in_pack(
+            move_line_ids, create_package_level=create_package_level
+        )
+        package_length = self._context.get("choose_delivery_package_length", 0)
+        package_width = self._context.get("choose_delivery_package_width", 0)
+        package_height = self._context.get("choose_delivery_package_height", 0)
+        package_weight = self._context.get("choose_delivery_package_pack_weight", 0)
+
+        res.write(
+            {
+                "pack_length": package_length,
+                "width": package_width,
+                "height": package_height,
+                "pack_weight": package_weight,
+            }
+        )
+
+        return res

From dbe2017244c226602b72b326a57e8b0eb562344f Mon Sep 17 00:00:00 2001
From: Rodrigo <rodrigo.bonilla@factorlibre.com>
Date: Thu, 30 May 2024 09:32:37 +0200
Subject: [PATCH 10/10] [IMP] delivery_carrier_package_measure_required:
 dimension control exceptions

greater granularity is implemented to control possible dimension control exceptions.
---
 .../models/stock_quant_package.py                          | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/delivery_carrier_package_measure_required/models/stock_quant_package.py b/delivery_carrier_package_measure_required/models/stock_quant_package.py
index c3ebdb3582..107fac8bce 100644
--- a/delivery_carrier_package_measure_required/models/stock_quant_package.py
+++ b/delivery_carrier_package_measure_required/models/stock_quant_package.py
@@ -18,10 +18,13 @@ class StockQuantPackage(models.Model):
     @api.constrains("pack_length", "width", "height", "shipping_weight", "quant_ids")
     def _check_required_dimension(self):
         ignore_pack_content = self.env.context.get(
-            "delivery_pkg_measure__ignore_package_content"
+            "delivery_pkg_measure__ignore_package_content", False
+        )
+        force_validation = self.env.context.get(
+            "delivery_pkg_measure__force_validation_package", False
         )
         for package in self:
-            if not ignore_pack_content and not package.quant_ids:
+            if ignore_pack_content or (not force_validation and not package.quant_ids):
                 # Only validate a package when it contains goods
                 continue
             required_dimension = []