From 6280a04cd2a0fe3fc32c1d9563fd0ce46fb77ead Mon Sep 17 00:00:00 2001 From: DavidJForgeFlow Date: Mon, 14 Oct 2024 08:55:12 +0200 Subject: [PATCH 01/21] [ADD] purchase_reception_status_line --- purchase_reception_status_line/README.rst | 100 ++++ purchase_reception_status_line/__init__.py | 1 + .../__manifest__.py | 16 + .../models/__init__.py | 2 + .../models/purchase_order.py | 35 ++ .../models/purchase_order_line.py | 68 +++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 9 + .../readme/USAGE.rst | 4 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 438 ++++++++++++++++++ .../tests/__init__.py | 4 + .../test_purchase_receipt_status_line.py | 76 +++ .../views/purchase_order.xml | 23 + 14 files changed, 777 insertions(+) create mode 100644 purchase_reception_status_line/README.rst create mode 100644 purchase_reception_status_line/__init__.py create mode 100644 purchase_reception_status_line/__manifest__.py create mode 100644 purchase_reception_status_line/models/__init__.py create mode 100644 purchase_reception_status_line/models/purchase_order.py create mode 100644 purchase_reception_status_line/models/purchase_order_line.py create mode 100644 purchase_reception_status_line/readme/CONTRIBUTORS.rst create mode 100644 purchase_reception_status_line/readme/DESCRIPTION.rst create mode 100644 purchase_reception_status_line/readme/USAGE.rst create mode 100644 purchase_reception_status_line/static/description/icon.png create mode 100644 purchase_reception_status_line/static/description/index.html create mode 100644 purchase_reception_status_line/tests/__init__.py create mode 100644 purchase_reception_status_line/tests/test_purchase_receipt_status_line.py create mode 100644 purchase_reception_status_line/views/purchase_order.xml diff --git a/purchase_reception_status_line/README.rst b/purchase_reception_status_line/README.rst new file mode 100644 index 00000000000..090788acccd --- /dev/null +++ b/purchase_reception_status_line/README.rst @@ -0,0 +1,100 @@ +============================== +Purchase Reception Status Line +============================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:f4b1b4db3d01699868997506525d3b3e05eaf22dac85ccd43586bbb2ad9f758e + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fpurchase--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/purchase-workflow/tree/15.0/purchase_reception_status_line + :alt: OCA/purchase-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/purchase-workflow-15-0/purchase-workflow-15-0-purchase_reception_status_line + :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/purchase-workflow&target_branch=15.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds a field *Reception Status* on purchase orders line. +On a confirmed purchase order line, it can have 3 different values: + +* Nothing Received +* Partially Received +* Fully Received + +Also takes this into account when computing the reception status for the +purchase order. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +If you are part of the *Purchase Manager* group, you can force a confirmed +purchase order to **Full Received** status: you have to check the field +**Force Received** located in the hidden fields on the +tree view (Order Lines tab). + +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 +~~~~~~~ + +* ForgeFlow + +Contributors +~~~~~~~~~~~~ + +* David Jiménez + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-DavidJForgeFlow| image:: https://github.com/DavidJForgeFlow.png?size=40px + :target: https://github.com/DavidJForgeFlow + :alt: DavidJForgeFlow + +Current `maintainer `__: + +|maintainer-DavidJForgeFlow| + +This module is part of the `OCA/purchase-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/purchase_reception_status_line/__init__.py b/purchase_reception_status_line/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/purchase_reception_status_line/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/purchase_reception_status_line/__manifest__.py b/purchase_reception_status_line/__manifest__.py new file mode 100644 index 00000000000..47438313fb0 --- /dev/null +++ b/purchase_reception_status_line/__manifest__.py @@ -0,0 +1,16 @@ +# Copyright 2024 ForgeFlow (http://www.akretion.com/) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Purchase Reception Status Line", + "version": "15.0.1.0.0", + "category": "Purchases", + "license": "AGPL-3", + "summary": "Add reception status on purchase order lines", + "author": "ForgeFlow,Odoo Community Association (OCA)", + "maintainers": ["DavidJForgeFlow"], + "website": "https://github.com/OCA/purchase-workflow", + "depends": ["purchase_reception_status"], + "data": ["views/purchase_order.xml"], + "installable": True, +} diff --git a/purchase_reception_status_line/models/__init__.py b/purchase_reception_status_line/models/__init__.py new file mode 100644 index 00000000000..677dbb3b247 --- /dev/null +++ b/purchase_reception_status_line/models/__init__.py @@ -0,0 +1,2 @@ +from . import purchase_order +from . import purchase_order_line diff --git a/purchase_reception_status_line/models/purchase_order.py b/purchase_reception_status_line/models/purchase_order.py new file mode 100644 index 00000000000..8924ee142c7 --- /dev/null +++ b/purchase_reception_status_line/models/purchase_order.py @@ -0,0 +1,35 @@ +# Copyright 2024 ForgeFlow (http://www.akretion.com/) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class PurchaseOrder(models.Model): + _inherit = "purchase.order" + + @api.depends( + "state", + "force_received", + "order_line.qty_received", + "order_line.product_qty", + "order_line.force_received", + "order_line.reception_status", + ) + def _compute_reception_status(self): + result = super()._compute_reception_status() + for order in self.filtered(lambda po: po.reception_status != "received"): + status = order.reception_status + if order.state in ("purchase", "done"): + if all( + [line.reception_status == "received" for line in order.order_line] + ): + status = "received" + elif any( + [ + line.reception_status in ["received", "partial"] + for line in order.order_line + ] + ): + status = "partial" + order.reception_status = status + return result diff --git a/purchase_reception_status_line/models/purchase_order_line.py b/purchase_reception_status_line/models/purchase_order_line.py new file mode 100644 index 00000000000..7268ab47f3a --- /dev/null +++ b/purchase_reception_status_line/models/purchase_order_line.py @@ -0,0 +1,68 @@ +# Copyright 2024 ForgeFlow (http://www.akretion.com/) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.tools import float_compare + + +class PurchaseOrderLine(models.Model): + _inherit = "purchase.order.line" + + reception_status = fields.Selection( + [ + ("no", "Nothing Received"), + ("partial", "Partially Received"), + ("received", "Fully Received"), + ], + compute="_compute_reception_status", + store=True, + ) + force_received = fields.Boolean( + readonly=False, + states={"draft": [("readonly", True)]}, + compute="_compute_force_received", + store=True, + copy=False, + help="If true, the reception status will be forced to Fully Received, " + "even if some quantities are not fully received. ", + ) + + @api.depends("order_id.force_received") + def _compute_force_received(self): + prec = self.env["decimal.precision"].precision_get("Product Unit of Measure") + for rec in self: + if ( + rec.order_id.force_received + and not float_compare( + rec.qty_received, rec.product_qty, precision_digits=prec + ) + >= 0 + ): + rec.force_received = True + + @api.depends( + "state", + "force_received", + "qty_received", + "product_qty", + "order_id.force_received", + ) + def _compute_reception_status(self): + prec = self.env["decimal.precision"].precision_get("Product Unit of Measure") + for line in self: + status = "no" + if line.order_id.state in ("purchase", "done"): + if line.force_received: + status = "received" + elif ( + float_compare( + line.qty_received, line.product_qty, precision_digits=prec + ) + >= 0 + ): + status = "received" + elif float_compare(line.qty_received, 0, precision_digits=prec) > 0: + status = "partial" + line.reception_status = ( + status if not line.order_id.force_received else "received" + ) diff --git a/purchase_reception_status_line/readme/CONTRIBUTORS.rst b/purchase_reception_status_line/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..fcd08101846 --- /dev/null +++ b/purchase_reception_status_line/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* David Jiménez diff --git a/purchase_reception_status_line/readme/DESCRIPTION.rst b/purchase_reception_status_line/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..09467e18a4d --- /dev/null +++ b/purchase_reception_status_line/readme/DESCRIPTION.rst @@ -0,0 +1,9 @@ +This module adds a field *Reception Status* on purchase orders line. +On a confirmed purchase order line, it can have 3 different values: + +* Nothing Received +* Partially Received +* Fully Received + +Also takes this into account when computing the reception status for the +purchase order. diff --git a/purchase_reception_status_line/readme/USAGE.rst b/purchase_reception_status_line/readme/USAGE.rst new file mode 100644 index 00000000000..bf662081706 --- /dev/null +++ b/purchase_reception_status_line/readme/USAGE.rst @@ -0,0 +1,4 @@ +If you are part of the *Purchase Manager* group, you can force a confirmed +purchase order to **Full Received** status: you have to check the field +**Force Received** located in the hidden fields on the +tree view (Order Lines tab). diff --git a/purchase_reception_status_line/static/description/icon.png b/purchase_reception_status_line/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/purchase_reception_status_line/static/description/index.html b/purchase_reception_status_line/static/description/index.html new file mode 100644 index 00000000000..b7fc27be527 --- /dev/null +++ b/purchase_reception_status_line/static/description/index.html @@ -0,0 +1,438 @@ + + + + + +Purchase Reception Status Line + + + +
+

Purchase Reception Status Line

+ + +

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

+

This module adds a field Reception Status on purchase orders line. +On a confirmed purchase order line, it can have 3 different values:

+
    +
  • Nothing Received
  • +
  • Partially Received
  • +
  • Fully Received
  • +
+

Also takes this into account when computing the reception status for the +purchase order.

+

Table of contents

+ +
+

Usage

+

If you are part of the Purchase Manager group, you can force a confirmed +purchase order to Full Received status: you have to check the field +Force Received located in the hidden fields on the +tree view (Order Lines tab).

+
+
+

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

+
    +
  • ForgeFlow
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

Current maintainer:

+

DavidJForgeFlow

+

This module is part of the OCA/purchase-workflow project on GitHub.

+

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

+
+
+
+ + diff --git a/purchase_reception_status_line/tests/__init__.py b/purchase_reception_status_line/tests/__init__.py new file mode 100644 index 00000000000..fbaa84a130e --- /dev/null +++ b/purchase_reception_status_line/tests/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2024 ForgeFlow (http://www.akretion.com/) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_purchase_receipt_status_line diff --git a/purchase_reception_status_line/tests/test_purchase_receipt_status_line.py b/purchase_reception_status_line/tests/test_purchase_receipt_status_line.py new file mode 100644 index 00000000000..1c30b73c9d1 --- /dev/null +++ b/purchase_reception_status_line/tests/test_purchase_receipt_status_line.py @@ -0,0 +1,76 @@ +# Copyright 2024 ForgeFlow (http://www.akretion.com/) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests import TransactionCase + + +class TestPurchaseReceiptionStatusLine(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner = cls.env["res.partner"].create({"name": "Purchase Partner"}) + cls.product = cls.env["product.product"].create( + # Use "service" type product to be able to set receipt qty manually + {"name": "Purchase Product", "type": "service"} + ) + cls.order = cls.env["purchase.order"].create( + { + "partner_id": cls.partner.id, + "company_id": cls.env.user.company_id.id, + } + ) + + def test_01_order_empty_with_lines(self): + """Test empty order w/ lines: receipt status should be received""" + line1 = self.env["purchase.order.line"].create( + { + "order_id": self.order.id, + "name": self.product.name, + "product_id": self.product.id, + "product_qty": 0.0, + } + ) + self.order.button_confirm() + self.assertEqual(line1.reception_status, "received") + + def test_02_order_with_lines(self): + """Test order w/ lines + + Add 2 lines: + 1) 20u ordered, 0u received + 2) 5u ordered, 5u received + """ + self.env["purchase.order.line"].create( + [ + { + "order_id": self.order.id, + "name": self.product.name, + "product_id": self.product.id, + "product_qty": 20.0, + "qty_received_manual": 0.0, + }, + { + "order_id": self.order.id, + "name": self.product.name, + "product_id": self.product.id, + "product_qty": 5.0, + "qty_received_manual": 3.0, + }, + ] + ) + self.order.button_confirm() + self.assertEqual(self.order.order_line[0].reception_status, "no") + self.assertEqual(self.order.order_line[1].reception_status, "partial") + self.order.order_line[0].force_received = True + self.assertEqual(self.order.order_line[0].reception_status, "received") + self.assertEqual(self.order.order_line[1].reception_status, "partial") + self.order.order_line[1].force_received = True + self.assertEqual(self.order.order_line[0].reception_status, "received") + self.assertEqual(self.order.order_line[1].reception_status, "received") + self.order.order_line[1].force_received = False + self.assertEqual(self.order.order_line[0].reception_status, "received") + self.assertEqual(self.order.order_line[1].reception_status, "partial") + self.order.force_received = True + self.assertEqual(self.order.order_line[0].reception_status, "received") + self.assertEqual(self.order.order_line[1].reception_status, "received") + self.assertEqual(self.order.order_line[1].force_received, True) diff --git a/purchase_reception_status_line/views/purchase_order.xml b/purchase_reception_status_line/views/purchase_order.xml new file mode 100644 index 00000000000..b0e3325c5dc --- /dev/null +++ b/purchase_reception_status_line/views/purchase_order.xml @@ -0,0 +1,23 @@ + + + + + received_status.purchase.order.form + purchase.order + + + + + + + + + From 5e619bb24ac294b1bd6db6770948b3b582b43be8 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 8 Jan 2025 22:06:12 +0000 Subject: [PATCH 02/21] [UPD] Update purchase_reception_status_line.pot --- .../i18n/purchase_reception_status_line.pot | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 purchase_reception_status_line/i18n/purchase_reception_status_line.pot diff --git a/purchase_reception_status_line/i18n/purchase_reception_status_line.pot b/purchase_reception_status_line/i18n/purchase_reception_status_line.pot new file mode 100644 index 00000000000..067b3fdeec4 --- /dev/null +++ b/purchase_reception_status_line/i18n/purchase_reception_status_line.pot @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_reception_status_line +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.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: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__force_received +msgid "Force Received" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__reception_status__received +msgid "Fully Received" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__force_received +msgid "" +"If true, the reception status will be forced to Fully Received, even if some" +" quantities are not fully received. " +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__reception_status__no +msgid "Nothing Received" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__reception_status__partial +msgid "Partially Received" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model,name:purchase_reception_status_line.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model,name:purchase_reception_status_line.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__reception_status +msgid "Reception Status" +msgstr "" From d7a43ba6e2e409d2c5f92aac2ef5bea707be3ded Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 8 Jan 2025 22:14:27 +0000 Subject: [PATCH 03/21] [BOT] post-merge updates --- purchase_reception_status_line/README.rst | 2 +- .../static/description/index.html | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/purchase_reception_status_line/README.rst b/purchase_reception_status_line/README.rst index 090788acccd..e204f92e83a 100644 --- a/purchase_reception_status_line/README.rst +++ b/purchase_reception_status_line/README.rst @@ -7,7 +7,7 @@ Purchase Reception Status Line !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:f4b1b4db3d01699868997506525d3b3e05eaf22dac85ccd43586bbb2ad9f758e + !! source digest: sha256:9541c63c150c0d4c5e18dae603d65200e816cdd13864b24d3de141a506654900 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/purchase_reception_status_line/static/description/index.html b/purchase_reception_status_line/static/description/index.html index b7fc27be527..ab9842571f8 100644 --- a/purchase_reception_status_line/static/description/index.html +++ b/purchase_reception_status_line/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 { @@ -366,7 +367,7 @@

Purchase Reception Status Line

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:f4b1b4db3d01699868997506525d3b3e05eaf22dac85ccd43586bbb2ad9f758e +!! source digest: sha256:9541c63c150c0d4c5e18dae603d65200e816cdd13864b24d3de141a506654900 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module adds a field Reception Status on purchase orders line. @@ -423,7 +424,9 @@

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.

From 4705b198a9fd8b4820b98b73cb93402502f2bd57 Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Wed, 21 May 2025 14:57:49 +0200 Subject: [PATCH 04/21] [IMP] purchase_reception_status_line: add over-received status and propagation logic for orders and lines --- .../__manifest__.py | 5 +- .../models/purchase_order.py | 32 +++++++- .../models/purchase_order_line.py | 51 ++++++------- .../static/description/index.html | 11 +-- .../test_purchase_receipt_status_line.py | 50 ++++++++++++ .../views/purchase_order_line_views.xml | 76 +++++++++++++++++++ 6 files changed, 190 insertions(+), 35 deletions(-) create mode 100644 purchase_reception_status_line/views/purchase_order_line_views.xml diff --git a/purchase_reception_status_line/__manifest__.py b/purchase_reception_status_line/__manifest__.py index 47438313fb0..95210b5dbbf 100644 --- a/purchase_reception_status_line/__manifest__.py +++ b/purchase_reception_status_line/__manifest__.py @@ -11,6 +11,9 @@ "maintainers": ["DavidJForgeFlow"], "website": "https://github.com/OCA/purchase-workflow", "depends": ["purchase_reception_status"], - "data": ["views/purchase_order.xml"], + "data": [ + "views/purchase_order.xml", + "views/purchase_order_line_views.xml", + ], "installable": True, } diff --git a/purchase_reception_status_line/models/purchase_order.py b/purchase_reception_status_line/models/purchase_order.py index 8924ee142c7..ae1e1bcc0c9 100644 --- a/purchase_reception_status_line/models/purchase_order.py +++ b/purchase_reception_status_line/models/purchase_order.py @@ -1,12 +1,42 @@ # Copyright 2024 ForgeFlow (http://www.akretion.com/) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import api, models +from odoo import api, fields, models class PurchaseOrder(models.Model): _inherit = "purchase.order" + force_received = fields.Boolean( + compute="_compute_force_received", + inverse="_inverse_force_received", + store=True, + tracking=True, + help="If true, the order is marked forced only when all lines are fully received" + " and at least one line was manually forced.", + ) + + @api.depends("order_line.reception_status", "order_line.force_received") + def _compute_force_received(self): + for po in self: + all_received = all( + line.reception_status == "received" for line in po.order_line + ) + any_forced = any(line.force_received for line in po.order_line) + po.force_received = all_received and any_forced + + def _inverse_force_received(self): + for po in self: + if po.force_received: + to_force = po.order_line.filtered( + lambda l: l.reception_status != "received" + ) + to_force.write({"force_received": True}) + else: + forced_lines = po.order_line.filtered(lambda l: l.force_received) + forced_lines.write({"force_received": False}) + forced_lines._compute_reception_status() + @api.depends( "state", "force_received", diff --git a/purchase_reception_status_line/models/purchase_order_line.py b/purchase_reception_status_line/models/purchase_order_line.py index 7268ab47f3a..95cb7bef1fc 100644 --- a/purchase_reception_status_line/models/purchase_order_line.py +++ b/purchase_reception_status_line/models/purchase_order_line.py @@ -6,46 +6,39 @@ class PurchaseOrderLine(models.Model): - _inherit = "purchase.order.line" + _name = "purchase.order.line" + _inherit = ["purchase.order.line", "mail.thread", "mail.activity.mixin"] reception_status = fields.Selection( [ ("no", "Nothing Received"), ("partial", "Partially Received"), ("received", "Fully Received"), + ("over", "Over Received"), ], compute="_compute_reception_status", store=True, ) force_received = fields.Boolean( + string="Force closed by Buyer", readonly=False, states={"draft": [("readonly", True)]}, - compute="_compute_force_received", store=True, copy=False, help="If true, the reception status will be forced to Fully Received, " "even if some quantities are not fully received. ", + tracking=True, ) - @api.depends("order_id.force_received") - def _compute_force_received(self): - prec = self.env["decimal.precision"].precision_get("Product Unit of Measure") + def action_commute_force_received(self): for rec in self: - if ( - rec.order_id.force_received - and not float_compare( - rec.qty_received, rec.product_qty, precision_digits=prec - ) - >= 0 - ): - rec.force_received = True + rec.force_received = not rec.force_received @api.depends( "state", "force_received", "qty_received", "product_qty", - "order_id.force_received", ) def _compute_reception_status(self): prec = self.env["decimal.precision"].precision_get("Product Unit of Measure") @@ -54,15 +47,21 @@ def _compute_reception_status(self): if line.order_id.state in ("purchase", "done"): if line.force_received: status = "received" - elif ( - float_compare( - line.qty_received, line.product_qty, precision_digits=prec - ) - >= 0 - ): - status = "received" - elif float_compare(line.qty_received, 0, precision_digits=prec) > 0: - status = "partial" - line.reception_status = ( - status if not line.order_id.force_received else "received" - ) + else: + if ( + float_compare( + line.qty_received, line.product_qty, precision_digits=prec + ) + > 0 + ): + status = "over" + elif ( + float_compare( + line.qty_received, line.product_qty, precision_digits=prec + ) + == 0 + ): + status = "received" + elif float_compare(line.qty_received, 0, precision_digits=prec) > 0: + status = "partial" + line.reception_status = status diff --git a/purchase_reception_status_line/static/description/index.html b/purchase_reception_status_line/static/description/index.html index ab9842571f8..dc5e872f45d 100644 --- a/purchase_reception_status_line/static/description/index.html +++ b/purchase_reception_status_line/static/description/index.html @@ -8,11 +8,10 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z 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. -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. @@ -275,7 +274,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: gray; } /* line numbers */ +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 } @@ -301,7 +300,7 @@ span.pre { white-space: pre } -span.problematic, pre.problematic { +span.problematic { color: red } span.section-subtitle { @@ -424,9 +423,7 @@

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.

diff --git a/purchase_reception_status_line/tests/test_purchase_receipt_status_line.py b/purchase_reception_status_line/tests/test_purchase_receipt_status_line.py index 1c30b73c9d1..3e5abdef272 100644 --- a/purchase_reception_status_line/tests/test_purchase_receipt_status_line.py +++ b/purchase_reception_status_line/tests/test_purchase_receipt_status_line.py @@ -74,3 +74,53 @@ def test_02_order_with_lines(self): self.assertEqual(self.order.order_line[0].reception_status, "received") self.assertEqual(self.order.order_line[1].reception_status, "received") self.assertEqual(self.order.order_line[1].force_received, True) + + def test_03_over_received_status(self): + over_line = self.env["purchase.order.line"].create( + { + "order_id": self.order.id, + "name": self.product.name, + "product_id": self.product.id, + "product_qty": 5.0, + "qty_received_manual": 7.0, + } + ) + self.order.button_confirm() + self.assertEqual(over_line.reception_status, "over") + over_line.force_received = True + self.assertEqual(over_line.reception_status, "received") + + def test_04_order_force_logic_and_propagation(self): + l1 = self.env["purchase.order.line"].create( + { + "order_id": self.order.id, + "name": self.product.name, + "product_id": self.product.id, + "product_qty": 4.0, + "qty_received_manual": 0.0, + } + ) + l2 = self.env["purchase.order.line"].create( + { + "order_id": self.order.id, + "name": self.product.name, + "product_id": self.product.id, + "product_qty": 3.0, + "qty_received_manual": 0.0, + } + ) + self.order.button_confirm() + self.assertTrue(l1.reception_status == "no") + self.assertTrue(l2.reception_status == "no") + self.assertFalse(self.order.force_received) + l1.force_received = True + self.assertFalse(self.order.force_received) + l2.force_received = True + self.assertTrue(self.order.force_received) + l1.force_received = False + self.assertFalse(self.order.force_received) + self.assertTrue(l2.force_received) + self.order.force_received = True + self.assertTrue(all(line.force_received for line in self.order.order_line)) + self.order.force_received = False + self.assertFalse(any(line.force_received for line in self.order.order_line)) diff --git a/purchase_reception_status_line/views/purchase_order_line_views.xml b/purchase_reception_status_line/views/purchase_order_line_views.xml new file mode 100644 index 00000000000..9a6c442844b --- /dev/null +++ b/purchase_reception_status_line/views/purchase_order_line_views.xml @@ -0,0 +1,76 @@ + + + + purchase.order.line.tree - purchase_reception_status_line + purchase.order.line + + + + + + +
From 1091f8b238a10460609386930c2ed8dd81aff059 Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Fri, 12 Sep 2025 13:12:06 +0200 Subject: [PATCH 14/21] [MIG] purchase_reception_status_line: Migration to 18.0 --- purchase_reception_status_line/__manifest__.py | 2 +- .../migrations/{17.0.1.1.0 => 18.0.1.1.0}/pre-migration.py | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename purchase_reception_status_line/migrations/{17.0.1.1.0 => 18.0.1.1.0}/pre-migration.py (100%) diff --git a/purchase_reception_status_line/__manifest__.py b/purchase_reception_status_line/__manifest__.py index 75d7a6aec18..80167c7f8f3 100644 --- a/purchase_reception_status_line/__manifest__.py +++ b/purchase_reception_status_line/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Purchase Reception Status Line", - "version": "17.0.1.1.0", + "version": "18.0.1.1.0", "category": "Purchases", "license": "AGPL-3", "summary": "Add reception status on purchase order lines", diff --git a/purchase_reception_status_line/migrations/17.0.1.1.0/pre-migration.py b/purchase_reception_status_line/migrations/18.0.1.1.0/pre-migration.py similarity index 100% rename from purchase_reception_status_line/migrations/17.0.1.1.0/pre-migration.py rename to purchase_reception_status_line/migrations/18.0.1.1.0/pre-migration.py From 5f50f90b54baeb22f2a3dee5f9e3109cc1d4628b Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 16 Sep 2025 10:50:26 +0000 Subject: [PATCH 15/21] [UPD] Update purchase_reception_status_line.pot --- .../i18n/purchase_reception_status_line.pot | 39 ++++++------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/purchase_reception_status_line/i18n/purchase_reception_status_line.pot b/purchase_reception_status_line/i18n/purchase_reception_status_line.pot index bdf62e727df..5e6e4f5bd70 100644 --- a/purchase_reception_status_line/i18n/purchase_reception_status_line.pot +++ b/purchase_reception_status_line/i18n/purchase_reception_status_line.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 15.0\n" +"Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -65,7 +65,7 @@ msgid "Force Received" msgstr "" #. module: purchase_reception_status_line -#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__reception_status__received +#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__receipt_status__full #: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters msgid "Fully Received" msgstr "" @@ -87,7 +87,6 @@ msgstr "" #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__message_needaction -#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__message_unread msgid "If checked, new messages require your attention." msgstr "" @@ -115,11 +114,6 @@ msgstr "" msgid "Is Follower" msgstr "" -#. module: purchase_reception_status_line -#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_main_attachment_id -msgid "Main Attachment" -msgstr "" - #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_has_error msgid "Message Delivery error" @@ -151,7 +145,7 @@ msgid "Next Activity Type" msgstr "" #. module: purchase_reception_status_line -#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__reception_status__no +#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__receipt_status__pending #: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters msgid "Nothing Received" msgstr "" @@ -168,7 +162,7 @@ msgstr "" #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__message_needaction_counter -msgid "Number of messages which requires an action" +msgid "Number of messages requiring action" msgstr "" #. module: purchase_reception_status_line @@ -177,18 +171,13 @@ msgid "Number of messages with delivery error" msgstr "" #. module: purchase_reception_status_line -#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__message_unread_counter -msgid "Number of unread messages" -msgstr "" - -#. module: purchase_reception_status_line -#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__reception_status__over +#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__receipt_status__over #: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters msgid "Over Received" msgstr "" #. module: purchase_reception_status_line -#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__reception_status__partial +#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__receipt_status__partial #: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters msgid "Partially Received" msgstr "" @@ -204,7 +193,11 @@ msgid "Purchase Order Line" msgstr "" #. module: purchase_reception_status_line -#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__reception_status +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__receipt_status +msgid "Receipt Status" +msgstr "" + +#. module: purchase_reception_status_line #: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters msgid "Reception Status" msgstr "" @@ -228,16 +221,6 @@ msgstr "" msgid "Type of the exception activity on record." msgstr "" -#. module: purchase_reception_status_line -#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_unread -msgid "Unread Messages" -msgstr "" - -#. module: purchase_reception_status_line -#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_unread_counter -msgid "Unread Messages Counter" -msgstr "" - #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__website_message_ids msgid "Website Messages" From d34f442fc9f7b79ec940a968f2aabc3aca93969e Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 16 Sep 2025 10:56:11 +0000 Subject: [PATCH 16/21] [BOT] post-merge updates --- purchase_reception_status_line/README.rst | 8 +++- .../static/description/index.html | 39 ++++++++++++------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/purchase_reception_status_line/README.rst b/purchase_reception_status_line/README.rst index 96c2b8da8c9..5d5e97e3a15 100644 --- a/purchase_reception_status_line/README.rst +++ b/purchase_reception_status_line/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ============================== Purchase Reception Status Line ============================== @@ -7,13 +11,13 @@ Purchase Reception Status Line !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:5ae88cb628d7cd60d526e0acc0f1a4de6c5b3ff1c854d93959d3f4b0230043f8 + !! source digest: sha256:584e98c86a9713c48bc45e5918b47794a8e3b6369586bca23d49282fe4162eb8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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 +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github diff --git a/purchase_reception_status_line/static/description/index.html b/purchase_reception_status_line/static/description/index.html index 752c3bbc195..0c1bcda25e5 100644 --- a/purchase_reception_status_line/static/description/index.html +++ b/purchase_reception_status_line/static/description/index.html @@ -3,15 +3,16 @@ -Purchase Reception Status Line +README.rst -
-

Purchase Reception Status Line

+
+ + +Odoo Community Association + +
+

Purchase Reception Status Line

-

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

+

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

This module adds a field Reception Status on purchase orders line. On a confirmed purchase order line, it can have 3 different values:

    @@ -395,14 +401,14 @@

    Purchase Reception Status Line

-

Usage

+

Usage

If you are part of the Purchase Manager group, you can force a confirmed purchase order to Full Received status: you have to check the field Force Received located in the hidden fields on the tree view (Order Lines tab).

-

Bug Tracker

+

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 @@ -410,23 +416,25 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • ForgeFlow
-

Maintainers

+

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.

@@ -437,5 +445,6 @@

Maintainers

+
From d52ef3dfb7dcdcdc8bcae78b79edbc4fe786a8cd Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 17 Sep 2025 13:14:06 +0000 Subject: [PATCH 17/21] Added translation using Weblate (Italian) --- purchase_reception_status_line/i18n/it.po | 233 ++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 purchase_reception_status_line/i18n/it.po diff --git a/purchase_reception_status_line/i18n/it.po b/purchase_reception_status_line/i18n/it.po new file mode 100644 index 00000000000..40cd187c514 --- /dev/null +++ b/purchase_reception_status_line/i18n/it.po @@ -0,0 +1,233 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_reception_status_line +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_ids +msgid "Activities" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_state +msgid "Activity State" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order__force_received +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__force_received +msgid "Force Received" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__receipt_status__full +#: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters +msgid "Fully Received" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__has_message +msgid "Has Message" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order__force_received +msgid "" +"If true, the order is marked forced only when all lines are fully received " +"and at least one line was manually forced." +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__force_received +msgid "" +"If true, the reception status will be forced to Fully Received, even if some" +" quantities are not fully received. " +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_ids +msgid "Messages" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__receipt_status__pending +#: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters +msgid "Nothing Received" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__receipt_status__over +#: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters +msgid "Over Received" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__receipt_status__partial +#: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters +msgid "Partially Received" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model,name:purchase_reception_status_line.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model,name:purchase_reception_status_line.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__receipt_status +msgid "Receipt Status" +msgstr "" + +#. module: purchase_reception_status_line +#: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters +msgid "Reception Status" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: purchase_reception_status_line +#: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__website_message_ids +msgid "Website communication history" +msgstr "" From a29a52693a9b4368bdd3defffdc21b3742b92ab9 Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 17 Sep 2025 13:16:36 +0000 Subject: [PATCH 18/21] Translated using Weblate (Italian) Currently translated at 100.0% (41 of 41 strings) Translation: purchase-workflow-18.0/purchase-workflow-18.0-purchase_reception_status_line Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_reception_status_line/it/ --- purchase_reception_status_line/i18n/it.po | 89 +++++++++++++---------- 1 file changed, 50 insertions(+), 39 deletions(-) diff --git a/purchase_reception_status_line/i18n/it.po b/purchase_reception_status_line/i18n/it.po index 40cd187c514..537851eb651 100644 --- a/purchase_reception_status_line/i18n/it.po +++ b/purchase_reception_status_line/i18n/it.po @@ -6,95 +6,97 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2025-09-17 13:37+0000\n" +"Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\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 5.10.4\n" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_needaction msgid "Action Needed" -msgstr "" +msgstr "Azione richiesta" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_ids msgid "Activities" -msgstr "" +msgstr "Attività" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_exception_decoration msgid "Activity Exception Decoration" -msgstr "" +msgstr "Decorazione eccezione attività" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_state msgid "Activity State" -msgstr "" +msgstr "Stato attività" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_type_icon msgid "Activity Type Icon" -msgstr "" +msgstr "Icona tipo attività" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_attachment_count msgid "Attachment Count" -msgstr "" +msgstr "Conteggio allegati" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_follower_ids msgid "Followers" -msgstr "" +msgstr "Seguito da" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_partner_ids msgid "Followers (Partners)" -msgstr "" +msgstr "Seguito da (partner)" #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__activity_type_icon msgid "Font awesome icon e.g. fa-tasks" -msgstr "" +msgstr "Icona Font Awesome es. fa-tasks" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order__force_received #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__force_received msgid "Force Received" -msgstr "" +msgstr "Forza a ricevuto" #. module: purchase_reception_status_line #: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__receipt_status__full #: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters msgid "Fully Received" -msgstr "" +msgstr "Ricevuto completamente" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__has_message msgid "Has Message" -msgstr "" +msgstr "Ha un messaggio" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_exception_icon msgid "Icon" -msgstr "" +msgstr "Icona" #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__activity_exception_icon msgid "Icon to indicate an exception activity." -msgstr "" +msgstr "Icona per indicare un'attività eccezione." #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__message_needaction msgid "If checked, new messages require your attention." -msgstr "" +msgstr "Se selezionata, nuovi messaggi richiedono attenzione." #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__message_has_error msgid "If checked, some messages have a delivery error." -msgstr "" +msgstr "Se selezionata, alcuni messaggi hanno un errore di consegna." #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order__force_received @@ -102,6 +104,9 @@ msgid "" "If true, the order is marked forced only when all lines are fully received " "and at least one line was manually forced." msgstr "" +"Se è vero, l'ordine viene contrassegnato come forzato solo quando tutte le " +"righe sono state ricevute completamente e almeno una riga è stata forzata " +"manualmente." #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__force_received @@ -109,104 +114,106 @@ msgid "" "If true, the reception status will be forced to Fully Received, even if some" " quantities are not fully received. " msgstr "" +"Se vero, lo stato di ricezione verrà forzato su completamente ricevuto, " +"anche se alcune quantità non sono state ricevute completamente. " #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_is_follower msgid "Is Follower" -msgstr "" +msgstr "Segue" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_has_error msgid "Message Delivery error" -msgstr "" +msgstr "Errore di consegna messaggio" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_ids msgid "Messages" -msgstr "" +msgstr "Messaggi" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__my_activity_date_deadline msgid "My Activity Deadline" -msgstr "" +msgstr "Scadenza mia attività" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_date_deadline msgid "Next Activity Deadline" -msgstr "" +msgstr "Scadenza prossima attività" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_summary msgid "Next Activity Summary" -msgstr "" +msgstr "Riepilogo prossima attività" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_type_id msgid "Next Activity Type" -msgstr "" +msgstr "Tipo prossima attività" #. module: purchase_reception_status_line #: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__receipt_status__pending #: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters msgid "Nothing Received" -msgstr "" +msgstr "Nulla ricevuto" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_needaction_counter msgid "Number of Actions" -msgstr "" +msgstr "Numero di azioni" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__message_has_error_counter msgid "Number of errors" -msgstr "" +msgstr "Numero di errori" #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__message_needaction_counter msgid "Number of messages requiring action" -msgstr "" +msgstr "Numero di messaggi che richiedono un'azione" #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__message_has_error_counter msgid "Number of messages with delivery error" -msgstr "" +msgstr "Numero di messaggi con errore di consegna" #. module: purchase_reception_status_line #: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__receipt_status__over #: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters msgid "Over Received" -msgstr "" +msgstr "Eccesso ricezione" #. module: purchase_reception_status_line #: model:ir.model.fields.selection,name:purchase_reception_status_line.selection__purchase_order_line__receipt_status__partial #: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters msgid "Partially Received" -msgstr "" +msgstr "Ricevuto parzialmente" #. module: purchase_reception_status_line #: model:ir.model,name:purchase_reception_status_line.model_purchase_order msgid "Purchase Order" -msgstr "" +msgstr "Ordine di acquisto" #. module: purchase_reception_status_line #: model:ir.model,name:purchase_reception_status_line.model_purchase_order_line msgid "Purchase Order Line" -msgstr "" +msgstr "Riga ordine di acquisto" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__receipt_status msgid "Receipt Status" -msgstr "" +msgstr "Stato ricevuta" #. module: purchase_reception_status_line #: model_terms:ir.ui.view,arch_db:purchase_reception_status_line.purchase_order_line_search_filters msgid "Reception Status" -msgstr "" +msgstr "Stato ricezione" #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__activity_user_id msgid "Responsible User" -msgstr "" +msgstr "Utente responsabile" #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__activity_state @@ -216,18 +223,22 @@ msgid "" "Today: Activity date is today\n" "Planned: Future activities." msgstr "" +"Stato in base alle attività\n" +"Scaduto: la data richiesta è trascorsa\n" +"Oggi: la data attività è oggi\n" +"Pianificato: attività future." #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__activity_exception_decoration msgid "Type of the exception activity on record." -msgstr "" +msgstr "Tipo di attività eccezione sul record." #. module: purchase_reception_status_line #: model:ir.model.fields,field_description:purchase_reception_status_line.field_purchase_order_line__website_message_ids msgid "Website Messages" -msgstr "" +msgstr "Messaggi sito web" #. module: purchase_reception_status_line #: model:ir.model.fields,help:purchase_reception_status_line.field_purchase_order_line__website_message_ids msgid "Website communication history" -msgstr "" +msgstr "Cronologia comunicazioni sito web" From 5c091a62124781a2d4fb57b5f8808802623192fb Mon Sep 17 00:00:00 2001 From: Francesco Foresti Date: Mon, 27 Oct 2025 09:07:33 +0000 Subject: [PATCH 19/21] Translated using Weblate (Italian) Currently translated at 100.0% (41 of 41 strings) Translation: purchase-workflow-18.0/purchase-workflow-18.0-purchase_reception_status_line Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_reception_status_line/it/ --- purchase_reception_status_line/i18n/it.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/purchase_reception_status_line/i18n/it.po b/purchase_reception_status_line/i18n/it.po index 537851eb651..e4163d68303 100644 --- a/purchase_reception_status_line/i18n/it.po +++ b/purchase_reception_status_line/i18n/it.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-09-17 13:37+0000\n" -"Last-Translator: mymage \n" +"PO-Revision-Date: 2025-10-27 09:50+0000\n" +"Last-Translator: Francesco Foresti \n" "Language-Team: none\n" "Language: it\n" "MIME-Version: 1.0\n" From 1f0170fa464fee4e8463a02eea95a8d9e5e56b3e Mon Sep 17 00:00:00 2001 From: Bhavesh Heliconia Date: Thu, 30 Apr 2026 15:55:20 +0530 Subject: [PATCH 20/21] [IMP] purchase_reception_status_line: pre-commit auto fixes --- .../views/purchase_order_line_views.xml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/purchase_reception_status_line/views/purchase_order_line_views.xml b/purchase_reception_status_line/views/purchase_order_line_views.xml index 72ed5fe57f6..955919ec99d 100644 --- a/purchase_reception_status_line/views/purchase_order_line_views.xml +++ b/purchase_reception_status_line/views/purchase_order_line_views.xml @@ -29,11 +29,7 @@ -
- - - -
+
From 03c29fb6db94e259829cf392b793884cbd58a0c4 Mon Sep 17 00:00:00 2001 From: Bhavesh Heliconia Date: Thu, 30 Apr 2026 15:58:09 +0530 Subject: [PATCH 21/21] [MIG] purchase_reception_status_line: Migration to 19.0 --- purchase_reception_status_line/README.rst | 10 +++++----- .../__manifest__.py | 2 +- .../migrations/18.0.1.1.0/pre-migration.py | 19 ------------------- .../static/description/index.html | 6 +++--- .../views/purchase_order_line_views.xml | 2 +- 5 files changed, 10 insertions(+), 29 deletions(-) delete mode 100644 purchase_reception_status_line/migrations/18.0.1.1.0/pre-migration.py diff --git a/purchase_reception_status_line/README.rst b/purchase_reception_status_line/README.rst index 5d5e97e3a15..ecacff862d0 100644 --- a/purchase_reception_status_line/README.rst +++ b/purchase_reception_status_line/README.rst @@ -21,13 +21,13 @@ Purchase Reception Status Line :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github - :target: https://github.com/OCA/purchase-workflow/tree/18.0/purchase_reception_status_line + :target: https://github.com/OCA/purchase-workflow/tree/19.0/purchase_reception_status_line :alt: OCA/purchase-workflow .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_reception_status_line + :target: https://translation.odoo-community.org/projects/purchase-workflow-19-0/purchase-workflow-19-0-purchase_reception_status_line :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/purchase-workflow&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -65,7 +65,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. @@ -103,6 +103,6 @@ Current `maintainer `__: |maintainer-DavidJForgeFlow| -This module is part of the `OCA/purchase-workflow `_ project on GitHub. +This module is part of the `OCA/purchase-workflow `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/purchase_reception_status_line/__manifest__.py b/purchase_reception_status_line/__manifest__.py index 80167c7f8f3..ac06c278ea7 100644 --- a/purchase_reception_status_line/__manifest__.py +++ b/purchase_reception_status_line/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Purchase Reception Status Line", - "version": "18.0.1.1.0", + "version": "19.0.1.1.0", "category": "Purchases", "license": "AGPL-3", "summary": "Add reception status on purchase order lines", diff --git a/purchase_reception_status_line/migrations/18.0.1.1.0/pre-migration.py b/purchase_reception_status_line/migrations/18.0.1.1.0/pre-migration.py deleted file mode 100644 index f9f6e0016d2..00000000000 --- a/purchase_reception_status_line/migrations/18.0.1.1.0/pre-migration.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2025 ForgeFlow S.L. -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) - -from openupgradelib import openupgrade - -_field_renames = [ - ( - "purchase.order.line", - "purchase_order_line", - "reception_status", - "receipt_status", - ), -] - - -@openupgrade.migrate() -def migrate(env, version): - if not openupgrade.column_exists(env.cr, "purchase_order_line", "receipt_status"): - openupgrade.rename_fields(env, _field_renames) diff --git a/purchase_reception_status_line/static/description/index.html b/purchase_reception_status_line/static/description/index.html index 0c1bcda25e5..7a85f42c82a 100644 --- a/purchase_reception_status_line/static/description/index.html +++ b/purchase_reception_status_line/static/description/index.html @@ -374,7 +374,7 @@

Purchase Reception Status Line

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:584e98c86a9713c48bc45e5918b47794a8e3b6369586bca23d49282fe4162eb8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

This module adds a field Reception Status on purchase orders line. On a confirmed purchase order line, it can have 3 different values:

    @@ -412,7 +412,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.

@@ -440,7 +440,7 @@

Maintainers

promote its widespread use.

Current maintainer:

DavidJForgeFlow

-

This module is part of the OCA/purchase-workflow project on GitHub.

+

This module is part of the OCA/purchase-workflow project on GitHub.

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

diff --git a/purchase_reception_status_line/views/purchase_order_line_views.xml b/purchase_reception_status_line/views/purchase_order_line_views.xml index 955919ec99d..87f697f910f 100644 --- a/purchase_reception_status_line/views/purchase_order_line_views.xml +++ b/purchase_reception_status_line/views/purchase_order_line_views.xml @@ -7,7 +7,7 @@ purchase.order.line - +