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

+ + +

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

+

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

+ +
+

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

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/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 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

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 @@

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.

@@ -417,16 +418,22 @@

Contributors

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/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 - +