diff --git a/purchase_request/__manifest__.py b/purchase_request/__manifest__.py index 2a51e4ba271..39f139ca21b 100644 --- a/purchase_request/__manifest__.py +++ b/purchase_request/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Purchase Request", "author": "ForgeFlow, Odoo Community Association (OCA)", - "version": "18.0.2.5.0", + "version": "18.0.2.6.0", "summary": "Use this module to have notification of requirements of " "materials and/or external services and keep track of such " "requirements.", diff --git a/purchase_request/models/purchase_order.py b/purchase_request/models/purchase_order.py index a52cbd6ac54..5916988570e 100644 --- a/purchase_request/models/purchase_order.py +++ b/purchase_request/models/purchase_order.py @@ -10,6 +10,56 @@ class PurchaseOrder(models.Model): _inherit = "purchase.order" + purchase_request_count = fields.Integer( + compute="_compute_purchase_request_count", + default=0, + ) + purchase_request_line_count = fields.Integer( + compute="_compute_purchase_request_line_count", + default=0, + ) + + @api.depends("order_line.purchase_request_lines") + def _compute_purchase_request_count(self): + for order in self: + order.purchase_request_count = len( + order.order_line.mapped("purchase_request_lines.request_id") + ) + + @api.depends("order_line.purchase_request_lines") + def _compute_purchase_request_line_count(self): + for order in self: + order.purchase_request_line_count = len( + order.order_line.mapped("purchase_request_lines") + ) + + def action_open_purchase_request(self): + self.ensure_one() + requests = self.order_line.mapped("purchase_request_lines.request_id") + action = self.env["ir.actions.act_window"]._for_xml_id( + "purchase_request.purchase_request_form_action" + ) + action["context"] = {} + if len(requests) == 1: + action.update( + { + "res_id": requests.id, + "views": [(False, "form")], + } + ) + else: + action["domain"] = [("id", "in", requests.ids)] + return action + + def action_open_purchase_request_lines(self): + self.ensure_one() + request_line_ids = self.order_line.mapped("purchase_request_lines").ids + action = self.env["ir.actions.act_window"]._for_xml_id( + "purchase_request.purchase_request_line_form_action" + ) + action["domain"] = [("id", "in", request_line_ids)] + return action + def _purchase_request_confirm_message_content(self, request, request_dict=None): self.ensure_one() if not request_dict: @@ -241,3 +291,20 @@ def write(self, vals): for line in service_lines: line.update_service_allocations(prev_qty_received[line.id]) return res + + @api.constrains("product_id", "purchase_request_lines") + def _check_product_from_request(self): + errors = [] + for line in self: + for request_line in line.purchase_request_lines: + if request_line.product_id != line.product_id: + errors.append( + _( + "The product %(product_name)s in the Purchase Order Line " + "must be the same as the product in the Purchase Request " + "Line.", + product_name=line.product_id.display_name, + ) + ) + if errors: + raise exceptions.ValidationError("\n".join(errors)) diff --git a/purchase_request/views/purchase_order_view.xml b/purchase_request/views/purchase_order_view.xml index 88600239c2c..6b9089f108c 100644 --- a/purchase_request/views/purchase_order_view.xml +++ b/purchase_request/views/purchase_order_view.xml @@ -7,6 +7,34 @@ purchase.order + + + +