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