Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion purchase_request/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.",
Expand Down
67 changes: 67 additions & 0 deletions purchase_request/models/purchase_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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))
28 changes: 28 additions & 0 deletions purchase_request/views/purchase_order_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,34 @@
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form" />
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button
type="object"
name="action_open_purchase_request"
class="oe_stat_button"
icon="fa-folder-open-o"
invisible="purchase_request_count == 0"
>
<field
name="purchase_request_count"
widget="statinfo"
string="Purchase Request"
/>
</button>
<button
type="object"
name="action_open_purchase_request_lines"
class="oe_stat_button"
icon="fa-bars"
invisible="purchase_request_line_count == 0"
>
<field
name="purchase_request_line_count"
widget="statinfo"
string="Purchase Request Lines"
/>
</button>
</xpath>
<xpath expr="//field[@name='order_line']/list" position="inside">
<field name="purchase_request_lines" column_invisible="1" />
<button
Expand Down
Loading