From 4b2dcb4a86c02be0c65a2dd82bf1f2ab10780306 Mon Sep 17 00:00:00 2001 From: Mathieu Date: Mon, 24 Jun 2024 17:34:58 +0200 Subject: [PATCH] [ADD] sale_order_line_date_next_reception --- .../__init__.py | 1 + .../__manifest__.py | 24 ++++++++ .../models/__init__.py | 1 + .../models/sale_order_line.py | 18 ++++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 1 + .../tests/__init__.py | 2 + .../tests/test_sale_line_reception_date.py | 58 +++++++++++++++++++ .../views/sale_order_view.xml | 15 +++++ 9 files changed, 121 insertions(+) create mode 100644 sale_order_line_date_next_reception/__init__.py create mode 100644 sale_order_line_date_next_reception/__manifest__.py create mode 100644 sale_order_line_date_next_reception/models/__init__.py create mode 100644 sale_order_line_date_next_reception/models/sale_order_line.py create mode 100644 sale_order_line_date_next_reception/readme/CONTRIBUTORS.rst create mode 100644 sale_order_line_date_next_reception/readme/DESCRIPTION.rst create mode 100644 sale_order_line_date_next_reception/tests/__init__.py create mode 100644 sale_order_line_date_next_reception/tests/test_sale_line_reception_date.py create mode 100644 sale_order_line_date_next_reception/views/sale_order_view.xml diff --git a/sale_order_line_date_next_reception/__init__.py b/sale_order_line_date_next_reception/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/sale_order_line_date_next_reception/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_order_line_date_next_reception/__manifest__.py b/sale_order_line_date_next_reception/__manifest__.py new file mode 100644 index 0000000..07ffe11 --- /dev/null +++ b/sale_order_line_date_next_reception/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2024 Akretion (https://www.akretion.com). +# @author Mathieu DELVA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +{ + "name": "sale_order_line_date_next_reception", + "summary": "Next reception Date on sale order line", + "version": "14.0.1.0.0", + "category": "Sale", + "author": "Akretion", + "website": "https://github.com/akretion/odoo-usability", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": [ + "sale", + "purchase", + "stock" + ], + "data": [ + "views/sale_order_view.xml", + ], +} diff --git a/sale_order_line_date_next_reception/models/__init__.py b/sale_order_line_date_next_reception/models/__init__.py new file mode 100644 index 0000000..8eb9d1d --- /dev/null +++ b/sale_order_line_date_next_reception/models/__init__.py @@ -0,0 +1 @@ +from . import sale_order_line diff --git a/sale_order_line_date_next_reception/models/sale_order_line.py b/sale_order_line_date_next_reception/models/sale_order_line.py new file mode 100644 index 0000000..c87ee18 --- /dev/null +++ b/sale_order_line_date_next_reception/models/sale_order_line.py @@ -0,0 +1,18 @@ +# Copyright 2024 Akretion (http://www.akretion.com). +# @author Mathieu DELVA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class SaleOrderLine(models.Model): + _inherit = "sale.order.line" + + date_next_reception = fields.Date(compute="_compute_date_next_reception") + + def _compute_date_next_reception(self): + for line in self: + line.date_next_reception = False + if not(line.product_id.qty_available): + purchase_order_lines = line.product_id.purchase_order_line_ids + line.date_next_reception = purchase_order_lines and purchase_order_lines[0].date_planned diff --git a/sale_order_line_date_next_reception/readme/CONTRIBUTORS.rst b/sale_order_line_date_next_reception/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..bec244e --- /dev/null +++ b/sale_order_line_date_next_reception/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Mathieu Delva diff --git a/sale_order_line_date_next_reception/readme/DESCRIPTION.rst b/sale_order_line_date_next_reception/readme/DESCRIPTION.rst new file mode 100644 index 0000000..6108f91 --- /dev/null +++ b/sale_order_line_date_next_reception/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module displays the date of receipt of the product on the sale order line when the product is no longer in stock and there is a purchase in progress \ No newline at end of file diff --git a/sale_order_line_date_next_reception/tests/__init__.py b/sale_order_line_date_next_reception/tests/__init__.py new file mode 100644 index 0000000..a3de5e0 --- /dev/null +++ b/sale_order_line_date_next_reception/tests/__init__.py @@ -0,0 +1,2 @@ +# from . import test_sale_line_number +from . import test_sale_line_reception_date \ No newline at end of file diff --git a/sale_order_line_date_next_reception/tests/test_sale_line_reception_date.py b/sale_order_line_date_next_reception/tests/test_sale_line_reception_date.py new file mode 100644 index 0000000..08692e1 --- /dev/null +++ b/sale_order_line_date_next_reception/tests/test_sale_line_reception_date.py @@ -0,0 +1,58 @@ +# Copyright 2024 Akretion (http://www.akretion.com). +# @author Mathieu DELVA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo.tests.common import TransactionCase +from datetime import datetime +from dateutil.relativedelta import relativedelta + + +class TestSaleLineReceptionDate(TransactionCase): + def setUp(self): + super().setUp() + self.partner = self.env.ref("base.res_partner_12") + self.product_id = self.env.ref("product.product_product_5") + + self.purchase_order = self.env["purchase.order"].create( + { + "partner_id": self.partner.id, + "date_order": datetime.today() + relativedelta(days=10), + "order_line": [(0, 0, { + "product_id": self.product_id.id, + "product_qty": 5, + })] + }) + + def test_date_next_reception(self): + self.purchase_order.button_confirm() + self.sale_order = self.env["sale.order"].create( + { + "partner_id": self.partner.id, + "order_line": [(0, 0, { + "product_id": self.product_id.id, + "product_uom_qty": 2 + })] + }) + self.assertEqual(self.purchase_order.date_planned.date(), self.sale_order.order_line.date_next_reception) + + def test_2_date_next_reception(self): + self.purchase_order.button_confirm() + self.purchase_order2 = self.env["purchase.order"].create( + { + "partner_id": self.partner.id, + "date_order": datetime.today() + relativedelta(days=4), + "order_line": [(0, 0, { + "product_id": self.product_id.id, + "product_qty": 5, + })] + }) + self.sale_order = self.env["sale.order"].create( + { + "partner_id": self.partner.id, + "order_line": [(0, 0, { + "product_id": self.product_id.id, + "product_uom_qty": 2 + })] + }) + self.purchase_order2.button_confirm() + self.assertEqual(self.purchase_order2.date_planned.date(), self.sale_order.order_line.date_next_reception) diff --git a/sale_order_line_date_next_reception/views/sale_order_view.xml b/sale_order_line_date_next_reception/views/sale_order_view.xml new file mode 100644 index 0000000..f6f126b --- /dev/null +++ b/sale_order_line_date_next_reception/views/sale_order_view.xml @@ -0,0 +1,15 @@ + + + + sale.order + + + + + + + +