From 550d9f28e9dc6f8b5e4da544e715fd173ab67312 Mon Sep 17 00:00:00 2001 From: Unai Beristain Date: Fri, 24 Jan 2025 09:10:08 +0100 Subject: [PATCH] [ADD] purchase_requisition_filter_date: Add fields filter_date_from and filter_date_to --- purchase_requisition_filter_date/README.rst | 50 +++++++++++++ purchase_requisition_filter_date/__init__.py | 3 + .../__manifest__.py | 15 ++++ .../models/__init__.py | 2 + .../models/purchase_order_line.py | 15 ++++ .../models/purchase_requisition.py | 8 ++ .../views/purchase_requisition_views.xml | 16 ++++ .../wizard/__init__.py | 1 + .../wizard/purchase_requisition_wizard.py | 74 +++++++++++++++++++ .../purchase_requisition_wizard_views.xml | 14 ++++ .../addons/purchase_requisition_filter_date | 1 + .../purchase_requisition_filter_date/setup.py | 6 ++ 12 files changed, 205 insertions(+) create mode 100644 purchase_requisition_filter_date/README.rst create mode 100644 purchase_requisition_filter_date/__init__.py create mode 100644 purchase_requisition_filter_date/__manifest__.py create mode 100644 purchase_requisition_filter_date/models/__init__.py create mode 100644 purchase_requisition_filter_date/models/purchase_order_line.py create mode 100644 purchase_requisition_filter_date/models/purchase_requisition.py create mode 100644 purchase_requisition_filter_date/views/purchase_requisition_views.xml create mode 100644 purchase_requisition_filter_date/wizard/__init__.py create mode 100644 purchase_requisition_filter_date/wizard/purchase_requisition_wizard.py create mode 100644 purchase_requisition_filter_date/wizard/purchase_requisition_wizard_views.xml create mode 120000 setup/purchase_requisition_filter_date/odoo/addons/purchase_requisition_filter_date create mode 100644 setup/purchase_requisition_filter_date/setup.py diff --git a/purchase_requisition_filter_date/README.rst b/purchase_requisition_filter_date/README.rst new file mode 100644 index 0000000000..88f033c8bb --- /dev/null +++ b/purchase_requisition_filter_date/README.rst @@ -0,0 +1,50 @@ +.. image:: https://img.shields.io/badge/license-LGPL--3-blue.svg + :target: https://opensource.org/licenses/LGPL-3.0 + :alt: License: LGPL-3 + +=================================== +Purchase Requisition Filter by Date +=================================== + +Overview +======== + +The **Purchase Requisition Filter by Date** module allows users to filter purchase requisition lines by a date range. This is particularly helpful in managing large purchase requisitions by focusing on specific scheduled dates. + +Features +======== + +- **Date Range Filters**: + + - Add fields for "From Date" and "To Date" on the purchase requisition form. + + - Filter purchase requisition lines based on the provided date range. + +- **Enhanced Workflow**: + + - Update the wizard for creating purchase orders to respect the filtered date range. + +- **Automatic Grouping**: + + - Group requisition lines by scheduled date and create purchase orders with the appropriate planned dates. + +Bug Tracker +=========== + +If you encounter any issues, please report them on the GitHub repository at `GitHub Issues `_. + +Credits +======= + +Contributors +------------ + +* Ana Juaristi +* Unai Beristain + +For specific questions or support, please contact the contributors. + +License +======= + +This project is licensed under the LGPL-3 License. For more details, refer to the LICENSE file or visit . diff --git a/purchase_requisition_filter_date/__init__.py b/purchase_requisition_filter_date/__init__.py new file mode 100644 index 0000000000..95c7515fda --- /dev/null +++ b/purchase_requisition_filter_date/__init__.py @@ -0,0 +1,3 @@ +from . import models + +# from . import wizard diff --git a/purchase_requisition_filter_date/__manifest__.py b/purchase_requisition_filter_date/__manifest__.py new file mode 100644 index 0000000000..85edb108e5 --- /dev/null +++ b/purchase_requisition_filter_date/__manifest__.py @@ -0,0 +1,15 @@ +{ + "name": "Purchase Requisition Filter by Date", + "version": "16.0.1.0.0", + "category": "Purchases", + "author": "Avanzosc", + "license": "LGPL-3", + "depends": ["purchase_requisition"], + "data": [ + # "views/purchase_requisition_views.xml", + # "wizard/purchase_requisition_wizard_views.xml", + ], + "installable": True, + "application": False, + "website": "https://github.com/avanzosc/odoo-addons", +} diff --git a/purchase_requisition_filter_date/models/__init__.py b/purchase_requisition_filter_date/models/__init__.py new file mode 100644 index 0000000000..ab9f821f5d --- /dev/null +++ b/purchase_requisition_filter_date/models/__init__.py @@ -0,0 +1,2 @@ +from . import purchase_order_line +from . import purchase_requisition diff --git a/purchase_requisition_filter_date/models/purchase_order_line.py b/purchase_requisition_filter_date/models/purchase_order_line.py new file mode 100644 index 0000000000..909db70538 --- /dev/null +++ b/purchase_requisition_filter_date/models/purchase_order_line.py @@ -0,0 +1,15 @@ +from odoo import api, models + + +class PurchaseOrderLine(models.Model): + _inherit = "purchase.order.line" + + @api.model_create_multi + def create(self, vals_list): + if "purchase_requisition_date" in self.env.context: + for i in range(len(vals_list) - 1, -1, -1): + if "date_planned" not in vals_list[i]: + del vals_list[i] + if "purchase_requisition_date" in self.env.context and not vals_list: + return self.env["purchase.order.line"] + return super().create(vals_list) diff --git a/purchase_requisition_filter_date/models/purchase_requisition.py b/purchase_requisition_filter_date/models/purchase_requisition.py new file mode 100644 index 0000000000..2dfd6137a0 --- /dev/null +++ b/purchase_requisition_filter_date/models/purchase_requisition.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class PurchaseRequisition(models.Model): + _inherit = "purchase.requisition" + + date_from = fields.Date(string="From") + date_to = fields.Date(string="To") diff --git a/purchase_requisition_filter_date/views/purchase_requisition_views.xml b/purchase_requisition_filter_date/views/purchase_requisition_views.xml new file mode 100644 index 0000000000..3d98f5135c --- /dev/null +++ b/purchase_requisition_filter_date/views/purchase_requisition_views.xml @@ -0,0 +1,16 @@ + + + purchase.requisition.form.inherit.filter.date + purchase.requisition + + + + + + + + + diff --git a/purchase_requisition_filter_date/wizard/__init__.py b/purchase_requisition_filter_date/wizard/__init__.py new file mode 100644 index 0000000000..a44cf6e014 --- /dev/null +++ b/purchase_requisition_filter_date/wizard/__init__.py @@ -0,0 +1 @@ +from . import purchase_requisition_wizard diff --git a/purchase_requisition_filter_date/wizard/purchase_requisition_wizard.py b/purchase_requisition_filter_date/wizard/purchase_requisition_wizard.py new file mode 100644 index 0000000000..e384eb4a2f --- /dev/null +++ b/purchase_requisition_filter_date/wizard/purchase_requisition_wizard.py @@ -0,0 +1,74 @@ +from odoo import _, api, fields, models + + +class PurchaseRequisitionAlternativeWarning(models.TransientModel): + _inherit = "purchase.requisition.alternative.warning" + + @api.model + def _default_alternatives_filter_date(self): + po_obj = self.env["purchase.order"] + alternatives = self._default_alternative_po_ids() + filtered_alternatives = [] + for alternative in alternatives: + po_info = alternative[2] + po = po_obj.browse(po_info.get("po_id")) + valid = True + if ( + po.date_order and po.date_planned and po.date_planned < po.date_order + ) or ( + po.date_deadline + and po.date_planned + and po.date_planned > po.date_deadline + ): + valid = False + if valid: + filtered_alternatives.append(alternative) + return filtered_alternatives + + alternative_po_ids = fields.Many2many( + default=_default_alternatives_filter_date, + ) + + def action_group_by_date(self): + dates = set(self.alternative_po_ids.mapped("date_planned")) + grouped_alternatives = [] + for date in dates: + result = self.with_context( + purchase_requisition_date=date + )._group_alternatives() + if "domain" in result: + domain = result.get("domain") + grouped_alternatives += domain[0][2] + return { + "domain": [("id", "in", grouped_alternatives)], + "name": _("Grouped Alternatives"), + "view_type": "form", + "view_mode": "tree,form", + "res_model": "purchase.order", + "context": {"from_grouped_alternatives": True}, + "type": "ir.actions.act_window", + } + + def _group_alternatives(self): + # Implementa la lógica para agrupar alternativas por fecha o cualquier otro criterio necesario. + # Retorna un resultado con el dominio de las alternativas agrupadas. + return { + "domain": [("id", "in", self.alternative_po_ids.ids)], + } + + def _prepare_po_vals(self, supplier, currency_id, alternative_lines_by_supplier): + vals = super()._prepare_po_vals( + supplier, currency_id, alternative_lines_by_supplier + ) + if "purchase_requisition_date" in self.env.context: + vals["date_planned"] = self.env.context.get("purchase_requisition_date") + return vals + + def _prepare_po_line_vals(self, line): + vals = super()._prepare_po_line_vals(line) + if ( + "purchase_requisition_date" in self.env.context + and line.date_planned == self.env.context.get("purchase_requisition_date") + ): + vals["date_planned"] = self.env.context.get("purchase_requisition_date") + return vals diff --git a/purchase_requisition_filter_date/wizard/purchase_requisition_wizard_views.xml b/purchase_requisition_filter_date/wizard/purchase_requisition_wizard_views.xml new file mode 100644 index 0000000000..52764d51d5 --- /dev/null +++ b/purchase_requisition_filter_date/wizard/purchase_requisition_wizard_views.xml @@ -0,0 +1,14 @@ + + + + Alternative Warning Inherited + purchase.requisition.alternative.warning + + + + + + + + + \ No newline at end of file diff --git a/setup/purchase_requisition_filter_date/odoo/addons/purchase_requisition_filter_date b/setup/purchase_requisition_filter_date/odoo/addons/purchase_requisition_filter_date new file mode 120000 index 0000000000..44bc7404f0 --- /dev/null +++ b/setup/purchase_requisition_filter_date/odoo/addons/purchase_requisition_filter_date @@ -0,0 +1 @@ +../../../../purchase_requisition_filter_date \ No newline at end of file diff --git a/setup/purchase_requisition_filter_date/setup.py b/setup/purchase_requisition_filter_date/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/purchase_requisition_filter_date/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)