From d7b0e2e4afba691d74c6acae73c19c0a5d1b2daa Mon Sep 17 00:00:00 2001
From: sbejaoui
Date: Thu, 22 Aug 2024 14:50:29 +0200
Subject: [PATCH 1/5] [ADD] add rma_lot
---
rma_lot/README.rst | 93 ++++
rma_lot/__init__.py | 2 +
rma_lot/__manifest__.py | 15 +
rma_lot/models/__init__.py | 1 +
rma_lot/models/rma.py | 22 +
rma_lot/readme/CONTRIBUTORS.md | 2 +
rma_lot/readme/DESCRIPTION.md | 15 +
rma_lot/static/description/icon.png | Bin 0 -> 9455 bytes
rma_lot/static/description/index.html | 435 +++++++++++++++++++
rma_lot/tests/__init__.py | 1 +
rma_lot/tests/test_rma_lot.py | 95 ++++
rma_lot/views/rma.xml | 41 ++
rma_lot/wizards/__init__.py | 1 +
rma_lot/wizards/stock_return_picking_line.py | 14 +
14 files changed, 737 insertions(+)
create mode 100644 rma_lot/README.rst
create mode 100644 rma_lot/__init__.py
create mode 100644 rma_lot/__manifest__.py
create mode 100644 rma_lot/models/__init__.py
create mode 100644 rma_lot/models/rma.py
create mode 100644 rma_lot/readme/CONTRIBUTORS.md
create mode 100644 rma_lot/readme/DESCRIPTION.md
create mode 100644 rma_lot/static/description/icon.png
create mode 100644 rma_lot/static/description/index.html
create mode 100644 rma_lot/tests/__init__.py
create mode 100644 rma_lot/tests/test_rma_lot.py
create mode 100644 rma_lot/views/rma.xml
create mode 100644 rma_lot/wizards/__init__.py
create mode 100644 rma_lot/wizards/stock_return_picking_line.py
diff --git a/rma_lot/README.rst b/rma_lot/README.rst
new file mode 100644
index 000000000..d473ba7c1
--- /dev/null
+++ b/rma_lot/README.rst
@@ -0,0 +1,93 @@
+=======
+Rma Lot
+=======
+
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:179ae979736d64a8afa520769acb7d060690a304e812587c70bf43b4542d2ea6
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |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%2Frma-lightgray.png?logo=github
+ :target: https://github.com/OCA/rma/tree/16.0/rma_lot
+ :alt: OCA/rma
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/rma-16-0/rma-16-0-rma_lot
+ :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/rma&target_branch=16.0
+ :alt: Try me on Runboat
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+Tracking returned products by lot or serial number is crucial for
+businesses that require precise monitoring, especially in industries
+where quality control, compliance, and inventory accuracy are critical.
+By enabling returns to be tracked by lot or serial numbers, this module
+ensures that each returned item is handled correctly, reducing the risk
+of errors, fraud, or compliance issues.
+
+This level of detail is essential for maintaining the integrity of
+inventory records, meeting regulatory requirements, and providing
+excellent customer service.
+
+The module extends the existing RMA functionality by adding a lot field
+to the RMA model, allowing users to associate returns with specific lot
+or serial numbers. This enhancement enforces stricter controls over
+return processes, ensuring that only the correct items are accepted
+during a return and that inventory records remain accurate.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us to smash it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+-------
+
+* ACSONE SA/NV
+* BCIM
+
+Contributors
+------------
+
+- Jacques-Etienne Baudoux - BCIM je@bcim.be
+- Souheil Bejaoui - ACSONE SA/NV souheil.bejaoui@acsone.eu
+
+Maintainers
+-----------
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+This module is part of the `OCA/rma `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/rma_lot/__init__.py b/rma_lot/__init__.py
new file mode 100644
index 000000000..aee8895e7
--- /dev/null
+++ b/rma_lot/__init__.py
@@ -0,0 +1,2 @@
+from . import models
+from . import wizards
diff --git a/rma_lot/__manifest__.py b/rma_lot/__manifest__.py
new file mode 100644
index 000000000..55c32a6fd
--- /dev/null
+++ b/rma_lot/__manifest__.py
@@ -0,0 +1,15 @@
+# Copyright 2024 ACSONE SA/NV
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+{
+ "name": "Rma Lot",
+ "summary": """
+ Manage lot in RMA""",
+ "version": "16.0.1.0.0",
+ "license": "AGPL-3",
+ "author": "ACSONE SA/NV,BCIM,Odoo Community Association (OCA)",
+ "website": "https://github.com/OCA/rma",
+ "depends": ["rma", "stock_picking_return_lot"],
+ "data": ["views/rma.xml"],
+ "demo": [],
+}
diff --git a/rma_lot/models/__init__.py b/rma_lot/models/__init__.py
new file mode 100644
index 000000000..0031f431f
--- /dev/null
+++ b/rma_lot/models/__init__.py
@@ -0,0 +1 @@
+from . import rma
diff --git a/rma_lot/models/rma.py b/rma_lot/models/rma.py
new file mode 100644
index 000000000..faa7d7cb4
--- /dev/null
+++ b/rma_lot/models/rma.py
@@ -0,0 +1,22 @@
+# Copyright 2024 ACSONE SA/NV
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import api, fields, models
+
+
+class Rma(models.Model):
+
+ _inherit = "rma"
+
+ lot_id = fields.Many2one(comodel_name="stock.lot", string="Lot/Serial Number")
+ lots_visible = fields.Boolean(compute="_compute_lots_visible")
+
+ @api.depends("product_id.tracking")
+ def _compute_lots_visible(self):
+ for rec in self:
+ rec.lots_visible = rec.product_id.tracking != "none"
+
+ def _prepare_reception_procurement_vals(self, group=None):
+ vals = super()._prepare_reception_procurement_vals(group=group)
+ vals["restrict_lot_id"] = self.lot_id.id
+ return vals
diff --git a/rma_lot/readme/CONTRIBUTORS.md b/rma_lot/readme/CONTRIBUTORS.md
new file mode 100644
index 000000000..0d74d13b4
--- /dev/null
+++ b/rma_lot/readme/CONTRIBUTORS.md
@@ -0,0 +1,2 @@
+- Jacques-Etienne Baudoux - BCIM
+- Souheil Bejaoui - ACSONE SA/NV
\ No newline at end of file
diff --git a/rma_lot/readme/DESCRIPTION.md b/rma_lot/readme/DESCRIPTION.md
new file mode 100644
index 000000000..637ea4605
--- /dev/null
+++ b/rma_lot/readme/DESCRIPTION.md
@@ -0,0 +1,15 @@
+Tracking returned products by lot or serial number is crucial for businesses
+that require precise monitoring, especially in industries where quality control,
+compliance, and inventory accuracy are critical.
+By enabling returns to be tracked by lot or serial numbers, this module ensures
+that each returned item is handled correctly, reducing the risk of errors,
+fraud, or compliance issues.
+
+This level of detail is essential for maintaining the integrity of inventory
+records, meeting regulatory requirements, and providing excellent customer service.
+
+The module extends the existing RMA functionality by adding a lot field to the
+RMA model, allowing users to associate returns with specific lot or serial numbers.
+This enhancement enforces stricter controls over return processes,
+ensuring that only the correct items are accepted during a return and that
+inventory records remain accurate.
diff --git a/rma_lot/static/description/icon.png b/rma_lot/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
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
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/rma_lot/static/description/index.html b/rma_lot/static/description/index.html
new file mode 100644
index 000000000..78f04070d
--- /dev/null
+++ b/rma_lot/static/description/index.html
@@ -0,0 +1,435 @@
+
+
+
+
+
+Rma Lot
+
+
+
+
+
Rma Lot
+
+
+
+
Tracking returned products by lot or serial number is crucial for
+businesses that require precise monitoring, especially in industries
+where quality control, compliance, and inventory accuracy are critical.
+By enabling returns to be tracked by lot or serial numbers, this module
+ensures that each returned item is handled correctly, reducing the risk
+of errors, fraud, or compliance issues.
+
This level of detail is essential for maintaining the integrity of
+inventory records, meeting regulatory requirements, and providing
+excellent customer service.
+
The module extends the existing RMA functionality by adding a lot field
+to the RMA model, allowing users to associate returns with specific lot
+or serial numbers. This enhancement enforces stricter controls over
+return processes, ensuring that only the correct items are accepted
+during a return and that inventory records remain accurate.
+
Table of contents
+
+
+
+
Bugs are tracked on GitHub Issues.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us to smash it by providing a detailed and welcomed
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+
+
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/rma project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
+
diff --git a/rma_lot/tests/__init__.py b/rma_lot/tests/__init__.py
new file mode 100644
index 000000000..25cf26216
--- /dev/null
+++ b/rma_lot/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_rma_lot
diff --git a/rma_lot/tests/test_rma_lot.py b/rma_lot/tests/test_rma_lot.py
new file mode 100644
index 000000000..5cd033e8a
--- /dev/null
+++ b/rma_lot/tests/test_rma_lot.py
@@ -0,0 +1,95 @@
+# Copyright 2020 Iryna Vyshnevska Camptocamp
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import Command
+from odoo.tests.common import Form, TransactionCase
+
+
+class TestRMALot(TransactionCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls.picking_obj = cls.env["stock.picking"]
+ partner = cls.env["res.partner"].create({"name": "Test"})
+ cls.product = cls.env["product.product"].create(
+ {"name": "test_product", "type": "product", "tracking": "lot"}
+ )
+ cls.lot_1 = cls.env["stock.lot"].create(
+ {"name": "000001", "product_id": cls.product.id}
+ )
+ cls.lot_2 = cls.env["stock.lot"].create(
+ {"name": "000002", "product_id": cls.product.id}
+ )
+ picking_type_out = cls.env.ref("stock.picking_type_out")
+ stock_location = cls.env.ref("stock.stock_location_stock")
+ customer_location = cls.env.ref("stock.stock_location_customers")
+ cls.env["stock.quant"]._update_available_quantity(
+ cls.product, stock_location, 1, lot_id=cls.lot_1
+ )
+ cls.env["stock.quant"]._update_available_quantity(
+ cls.product, stock_location, 2, lot_id=cls.lot_2
+ )
+ cls.picking = cls.picking_obj.create(
+ {
+ "partner_id": partner.id,
+ "picking_type_id": picking_type_out.id,
+ "location_id": stock_location.id,
+ "location_dest_id": customer_location.id,
+ "move_ids": [
+ Command.create(
+ {
+ "name": cls.product.name,
+ "product_id": cls.product.id,
+ "product_uom_qty": 3,
+ "product_uom": cls.product.uom_id.id,
+ "location_id": stock_location.id,
+ "location_dest_id": customer_location.id,
+ },
+ )
+ ],
+ }
+ )
+ cls.picking.action_confirm()
+ cls.picking.action_assign()
+ cls.picking.action_set_quantities_to_reservation()
+ cls.picking._action_done()
+ cls.operation = cls.env.ref("rma.rma_operation_replace")
+
+ @classmethod
+ def create_return_wiz(cls):
+ return (
+ cls.env["stock.return.picking"]
+ .with_context(active_id=cls.picking.id, active_model="stock.picking")
+ .create({"create_rma": True})
+ )
+
+ def test_00(self):
+ """
+ Check the process of creating RMAs when returning products tracked by lot
+ - The correct number of RMAs is created
+ - The RMAs are correctly associated with the lot
+ """
+ stock_return_picking_form = Form(
+ self.env["stock.return.picking"].with_context(
+ active_ids=self.picking.ids,
+ active_id=self.picking.id,
+ active_model="stock.picking",
+ )
+ )
+ stock_return_picking_form.create_rma = True
+ stock_return_picking_form.rma_operation_id = self.operation
+ return_wizard = stock_return_picking_form.save()
+ self.assertEqual(len(return_wizard.product_return_moves), 2)
+ return_wizard.create_returns()
+ self.assertEqual(self.picking.rma_count, 2)
+ rmas = self.picking.move_ids.rma_ids
+ rma_lot_1 = rmas.filtered(lambda r, lot=self.lot_1: r.lot_id == lot)
+ rma_lot_2 = rmas.filtered(lambda r, lot=self.lot_2: r.lot_id == lot)
+ self.assertTrue(rma_lot_1)
+ self.assertEqual(rma_lot_1.reception_move_id.restrict_lot_id, self.lot_1)
+ self.assertEqual(rma_lot_1.reception_move_id.state, "assigned")
+ self.assertEqual(rma_lot_1.reception_move_id.move_line_ids.lot_id, self.lot_1)
+ self.assertTrue(rma_lot_2)
+ self.assertEqual(rma_lot_2.reception_move_id.restrict_lot_id, self.lot_2)
+ self.assertEqual(rma_lot_2.reception_move_id.state, "assigned")
+ self.assertEqual(rma_lot_2.reception_move_id.move_line_ids.lot_id, self.lot_2)
diff --git a/rma_lot/views/rma.xml b/rma_lot/views/rma.xml
new file mode 100644
index 000000000..45dbfaeac
--- /dev/null
+++ b/rma_lot/views/rma.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+ rma
+
+
+
+
+
+
+
+
+
+
+ rma
+
+
+
+
+
+
+
+
+
+ rma
+
+
+
+
+
+
+
+
+
diff --git a/rma_lot/wizards/__init__.py b/rma_lot/wizards/__init__.py
new file mode 100644
index 000000000..2ed06ea13
--- /dev/null
+++ b/rma_lot/wizards/__init__.py
@@ -0,0 +1 @@
+from . import stock_return_picking_line
diff --git a/rma_lot/wizards/stock_return_picking_line.py b/rma_lot/wizards/stock_return_picking_line.py
new file mode 100644
index 000000000..f96353b87
--- /dev/null
+++ b/rma_lot/wizards/stock_return_picking_line.py
@@ -0,0 +1,14 @@
+# Copyright 2024 ACSONE SA/NV
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import models
+
+
+class StockReturnPickingLine(models.TransientModel):
+
+ _inherit = "stock.return.picking.line"
+
+ def _prepare_rma_vals(self):
+ vals = super()._prepare_rma_vals()
+ vals.update({"lot_id": self.lot_id.id})
+ return vals
From a481430782068811d4bd98b72903a1b6f59f77c3 Mon Sep 17 00:00:00 2001
From: sbejaoui
Date: Thu, 17 Oct 2024 10:02:22 +0200
Subject: [PATCH 2/5] [IMP] rma_lot: add onchange lot&product
---
rma_lot/models/rma.py | 21 ++++++++++++++++++++-
rma_lot/tests/test_rma_lot.py | 8 ++++++++
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/rma_lot/models/rma.py b/rma_lot/models/rma.py
index faa7d7cb4..55d18a984 100644
--- a/rma_lot/models/rma.py
+++ b/rma_lot/models/rma.py
@@ -8,7 +8,14 @@ class Rma(models.Model):
_inherit = "rma"
- lot_id = fields.Many2one(comodel_name="stock.lot", string="Lot/Serial Number")
+ lot_id = fields.Many2one(
+ comodel_name="stock.lot",
+ string="Lot/Serial Number",
+ domain="[('product_id', '=?', product_id)]",
+ compute="_compute_lot_id",
+ store=True,
+ readonly=False,
+ )
lots_visible = fields.Boolean(compute="_compute_lots_visible")
@api.depends("product_id.tracking")
@@ -20,3 +27,15 @@ def _prepare_reception_procurement_vals(self, group=None):
vals = super()._prepare_reception_procurement_vals(group=group)
vals["restrict_lot_id"] = self.lot_id.id
return vals
+
+ @api.depends("move_id", "lot_id")
+ def _compute_product_id(self):
+ res = super()._compute_product_id()
+ for rec in self:
+ if not rec.move_id and rec.lot_id:
+ self.product_id = rec.lot_id.product_id
+ return res
+
+ @api.depends("product_id")
+ def _compute_lot_id(self):
+ self.update({"lot_id": False})
diff --git a/rma_lot/tests/test_rma_lot.py b/rma_lot/tests/test_rma_lot.py
index 5cd033e8a..7f16241b9 100644
--- a/rma_lot/tests/test_rma_lot.py
+++ b/rma_lot/tests/test_rma_lot.py
@@ -93,3 +93,11 @@ def test_00(self):
self.assertEqual(rma_lot_2.reception_move_id.restrict_lot_id, self.lot_2)
self.assertEqual(rma_lot_2.reception_move_id.state, "assigned")
self.assertEqual(rma_lot_2.reception_move_id.move_line_ids.lot_id, self.lot_2)
+
+ def test_rma_form(self):
+ rma_form = Form(self.env["rma"])
+ self.assertFalse(rma_form.product_id)
+ rma_form.lot_id = self.lot_1
+ self.assertEqual(rma_form.product_id, self.product)
+ rma_form.product_id = self.env.ref("product.product_product_4")
+ self.assertFalse(rma_form.lot_id)
From ec7338871a7689d98e98c5825e4b25869d3b372c Mon Sep 17 00:00:00 2001
From: oca-ci
Date: Fri, 18 Oct 2024 07:17:24 +0000
Subject: [PATCH 3/5] [UPD] Update rma_lot.pot
---
rma_lot/i18n/rma_lot.pot | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
create mode 100644 rma_lot/i18n/rma_lot.pot
diff --git a/rma_lot/i18n/rma_lot.pot b/rma_lot/i18n/rma_lot.pot
new file mode 100644
index 000000000..0327520fb
--- /dev/null
+++ b/rma_lot/i18n/rma_lot.pot
@@ -0,0 +1,34 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * rma_lot
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: rma_lot
+#: model:ir.model.fields,field_description:rma_lot.field_rma__lot_id
+msgid "Lot/Serial Number"
+msgstr ""
+
+#. module: rma_lot
+#: model:ir.model.fields,field_description:rma_lot.field_rma__lots_visible
+msgid "Lots Visible"
+msgstr ""
+
+#. module: rma_lot
+#: model:ir.model,name:rma_lot.model_rma
+msgid "RMA"
+msgstr ""
+
+#. module: rma_lot
+#: model:ir.model,name:rma_lot.model_stock_return_picking_line
+msgid "Return Picking Line"
+msgstr ""
From d1eb93303cd13a6bb83d005dd68e1c0d15b70726 Mon Sep 17 00:00:00 2001
From: Antoni Marroig Campomar
Date: Fri, 18 Oct 2024 10:13:41 +0200
Subject: [PATCH 4/5] [IMP] rma_lot: pre-commit auto fixes
---
rma_lot/models/rma.py | 1 -
rma_lot/pyproject.toml | 3 +++
rma_lot/wizards/stock_return_picking_line.py | 1 -
3 files changed, 3 insertions(+), 2 deletions(-)
create mode 100644 rma_lot/pyproject.toml
diff --git a/rma_lot/models/rma.py b/rma_lot/models/rma.py
index 55d18a984..f61364bb7 100644
--- a/rma_lot/models/rma.py
+++ b/rma_lot/models/rma.py
@@ -5,7 +5,6 @@
class Rma(models.Model):
-
_inherit = "rma"
lot_id = fields.Many2one(
diff --git a/rma_lot/pyproject.toml b/rma_lot/pyproject.toml
new file mode 100644
index 000000000..4231d0ccc
--- /dev/null
+++ b/rma_lot/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/rma_lot/wizards/stock_return_picking_line.py b/rma_lot/wizards/stock_return_picking_line.py
index f96353b87..9ce1b1a4c 100644
--- a/rma_lot/wizards/stock_return_picking_line.py
+++ b/rma_lot/wizards/stock_return_picking_line.py
@@ -5,7 +5,6 @@
class StockReturnPickingLine(models.TransientModel):
-
_inherit = "stock.return.picking.line"
def _prepare_rma_vals(self):
From 5d2f897cdf46bcc008a8b45d40f678437e59ab96 Mon Sep 17 00:00:00 2001
From: Antoni Marroig Campomar
Date: Fri, 18 Oct 2024 14:16:56 +0200
Subject: [PATCH 5/5] [MIG] rma_lot: Migration to 17.0
---
rma_lot/README.rst | 13 ++++++++-----
rma_lot/__manifest__.py | 2 +-
rma_lot/readme/CONTRIBUTORS.md | 4 +++-
rma_lot/static/description/index.html | 21 ++++++++++++++-------
rma_lot/tests/test_rma_lot.py | 3 +--
rma_lot/views/rma.xml | 4 ++--
6 files changed, 29 insertions(+), 18 deletions(-)
diff --git a/rma_lot/README.rst b/rma_lot/README.rst
index d473ba7c1..11e9384a4 100644
--- a/rma_lot/README.rst
+++ b/rma_lot/README.rst
@@ -17,13 +17,13 @@ Rma Lot
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Frma-lightgray.png?logo=github
- :target: https://github.com/OCA/rma/tree/16.0/rma_lot
+ :target: https://github.com/OCA/rma/tree/17.0/rma_lot
:alt: OCA/rma
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/rma-16-0/rma-16-0-rma_lot
+ :target: https://translation.odoo-community.org/projects/rma-17-0/rma-17-0-rma_lot
: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/rma&target_branch=16.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/rma&target_branch=17.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -56,7 +56,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -74,6 +74,9 @@ Contributors
- Jacques-Etienne Baudoux - BCIM je@bcim.be
- Souheil Bejaoui - ACSONE SA/NV souheil.bejaoui@acsone.eu
+- `APSL-Nagarro `__:
+
+ - Antoni Marroig amarroig@apsl.net
Maintainers
-----------
@@ -88,6 +91,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/rma `_ project on GitHub.
+This module is part of the `OCA/rma `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/rma_lot/__manifest__.py b/rma_lot/__manifest__.py
index 55c32a6fd..7954e259b 100644
--- a/rma_lot/__manifest__.py
+++ b/rma_lot/__manifest__.py
@@ -5,7 +5,7 @@
"name": "Rma Lot",
"summary": """
Manage lot in RMA""",
- "version": "16.0.1.0.0",
+ "version": "17.0.1.0.0",
"license": "AGPL-3",
"author": "ACSONE SA/NV,BCIM,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/rma",
diff --git a/rma_lot/readme/CONTRIBUTORS.md b/rma_lot/readme/CONTRIBUTORS.md
index 0d74d13b4..e2f3a5dac 100644
--- a/rma_lot/readme/CONTRIBUTORS.md
+++ b/rma_lot/readme/CONTRIBUTORS.md
@@ -1,2 +1,4 @@
- Jacques-Etienne Baudoux - BCIM
-- Souheil Bejaoui - ACSONE SA/NV
\ No newline at end of file
+- Souheil Bejaoui - ACSONE SA/NV
+- [APSL-Nagarro]():
+ - Antoni Marroig
diff --git a/rma_lot/static/description/index.html b/rma_lot/static/description/index.html
index 78f04070d..c618b468e 100644
--- a/rma_lot/static/description/index.html
+++ b/rma_lot/static/description/index.html
@@ -8,10 +8,11 @@
/*
:Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
+:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
+Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
@@ -274,7 +275,7 @@
margin-left: 2em ;
margin-right: 2em }
-pre.code .ln { color: grey; } /* line numbers */
+pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
@@ -300,7 +301,7 @@
span.pre {
white-space: pre }
-span.problematic {
+span.problematic, pre.problematic {
color: red }
span.section-subtitle {
@@ -368,7 +369,7 @@ Rma Lot
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:179ae979736d64a8afa520769acb7d060690a304e812587c70bf43b4542d2ea6
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
Tracking returned products by lot or serial number is crucial for
businesses that require precise monitoring, especially in industries
where quality control, compliance, and inventory accuracy are critical.
@@ -400,7 +401,7 @@
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
This module is maintained by the OCA.
-
+
+
+
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/rma project on GitHub.
+
This module is part of the OCA/rma project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/rma_lot/tests/test_rma_lot.py b/rma_lot/tests/test_rma_lot.py
index 7f16241b9..bff6831f5 100644
--- a/rma_lot/tests/test_rma_lot.py
+++ b/rma_lot/tests/test_rma_lot.py
@@ -51,7 +51,7 @@ def setUpClass(cls):
)
cls.picking.action_confirm()
cls.picking.action_assign()
- cls.picking.action_set_quantities_to_reservation()
+ cls.picking.move_ids.picked = True
cls.picking._action_done()
cls.operation = cls.env.ref("rma.rma_operation_replace")
@@ -77,7 +77,6 @@ def test_00(self):
)
)
stock_return_picking_form.create_rma = True
- stock_return_picking_form.rma_operation_id = self.operation
return_wizard = stock_return_picking_form.save()
self.assertEqual(len(return_wizard.product_return_moves), 2)
return_wizard.create_returns()
diff --git a/rma_lot/views/rma.xml b/rma_lot/views/rma.xml
index 45dbfaeac..58881c745 100644
--- a/rma_lot/views/rma.xml
+++ b/rma_lot/views/rma.xml
@@ -12,7 +12,7 @@
@@ -22,7 +22,7 @@
rma
-
+