diff --git a/purchase_request/models/purchase_request_line.py b/purchase_request/models/purchase_request_line.py index 5c57c0793d2..5d859388a3c 100644 --- a/purchase_request/models/purchase_request_line.py +++ b/purchase_request/models/purchase_request_line.py @@ -5,12 +5,14 @@ from odoo.exceptions import UserError _STATES = [ - ("draft", "Draft"), - ("to_approve", "To be approved"), + ("draft", "RFQ"), + ("sent", "RFQ Sent"), + ("to_approve", "To Approve"), ("approved", "Approved"), - ("in_progress", "In progress"), - ("done", "Done"), - ("rejected", "Rejected"), + ("partially", "Partially Purchased"), + ("purchase", "Purchased"), + ("done", "Locked"), + ("cancel", "Cancelled"), ] @@ -91,7 +93,12 @@ class PurchaseRequestLine(models.Model): cancelled = fields.Boolean(readonly=True, default=False, copy=False) purchased_qty = fields.Float( - string="RFQ/PO Qty", + string="Purchased Quantity", + digits="Product Unit of Measure", + compute="_compute_purchased_qty", + ) + rfq_qty = fields.Float( + string="RFQ Quantity", digits="Product Unit of Measure", compute="_compute_purchased_qty", ) @@ -107,9 +114,7 @@ class PurchaseRequestLine(models.Model): purchase_state = fields.Selection( compute="_compute_purchase_state", string="Purchase Status", - selection=lambda self: self.env["purchase.order"] - ._fields["state"] - ._description_selection(self.env), + selection=_STATES, store=True, ) move_dest_ids = fields.One2many( @@ -300,31 +305,41 @@ def write(self, vals): def _compute_purchased_qty(self): for rec in self: - rec.purchased_qty = 0.0 - for line in rec.purchase_lines.filtered(lambda x: x.state != "cancel"): - if rec.product_uom_id and line.product_uom != rec.product_uom_id: - rec.purchased_qty += line.product_uom._compute_quantity( - line.product_qty, rec.product_uom_id - ) - else: - rec.purchased_qty += line.product_qty + purchased_lines = rec.purchase_lines.filtered( + lambda pol: pol.state in ["purchase", "done"] + ) + rfq_lines = rec.purchase_lines - purchased_lines + rec.purchased_qty = sum( + pol.product_uom._compute_quantity(pol.product_qty, rec.product_uom_id) + for pol in purchased_lines + ) + rec.rfq_qty = sum( + pol.product_uom._compute_quantity(pol.product_qty, rec.product_uom_id) + for pol in rfq_lines + ) @api.depends("purchase_lines.state", "purchase_lines.order_id.state") def _compute_purchase_state(self): for rec in self: temp_purchase_state = False if rec.purchase_lines: - if any(po_line.state == "done" for po_line in rec.purchase_lines): - temp_purchase_state = "done" - elif all(po_line.state == "cancel" for po_line in rec.purchase_lines): - temp_purchase_state = "cancel" - elif any(po_line.state == "purchase" for po_line in rec.purchase_lines): - temp_purchase_state = "purchase" + if any([po_line.state == "done" for po_line in rec.purchase_lines]): + temp_purchase_state = ( + "done" if rec.purchased_qty >= rec.product_qty else "partially" + ) + elif any( + [po_line.state == "purchase" for po_line in rec.purchase_lines] + ): + temp_purchase_state = ( + "purchase" + if rec.purchased_qty >= rec.product_qty + else "partially" + ) elif any( - po_line.state == "to approve" for po_line in rec.purchase_lines + [po_line.state == "to approve" for po_line in rec.purchase_lines] ): temp_purchase_state = "to approve" - elif any(po_line.state == "sent" for po_line in rec.purchase_lines): + elif any([po_line.state == "sent" for po_line in rec.purchase_lines]): temp_purchase_state = "sent" elif all( po_line.state in ("draft", "cancel") diff --git a/purchase_request/tests/test_purchase_request_to_rfq.py b/purchase_request/tests/test_purchase_request_to_rfq.py index de55884e922..e42b1262fc2 100644 --- a/purchase_request/tests/test_purchase_request_to_rfq.py +++ b/purchase_request/tests/test_purchase_request_to_rfq.py @@ -235,10 +235,16 @@ def test_purchase_request_to_purchase_rfq_multiple_po(self): item.onchange_product_id() wiz_id.make_purchase_order() self.assertEqual( - purchase_request_line1.purchased_qty, 1.0, "Should be a quantity of 1" + purchase_request_line1.rfq_qty, 1.0, "Quantity in RFQ should be 1" ) self.assertEqual( - purchase_request_line2.purchased_qty, 1.0, "Should be a quantity of 1" + purchase_request_line2.rfq_qty, 1.0, "Quantity in RFQ should be 1" + ) + purchase_request_line1.purchase_lines.order_id.print_quotation() + purchase_request_line1.purchase_lines.order_id.button_confirm() + purchase_request_line1._compute_purchased_qty() + self.assertEqual( + purchase_request_line1.purchased_qty, 1.0, "Purchased quantity should be 1" ) def test_purchase_request_to_purchase_rfq_multiple_PO_purchaseUoM(self): diff --git a/purchase_request/views/purchase_request_line_view.xml b/purchase_request/views/purchase_request_line_view.xml index 11ab026dca2..8f0afe812f4 100644 --- a/purchase_request/views/purchase_request_line_view.xml +++ b/purchase_request/views/purchase_request_line_view.xml @@ -25,6 +25,7 @@ + + diff --git a/purchase_request/views/purchase_request_view.xml b/purchase_request/views/purchase_request_view.xml index 25696084681..c1e8cb33cda 100644 --- a/purchase_request/views/purchase_request_view.xml +++ b/purchase_request/views/purchase_request_view.xml @@ -189,6 +189,7 @@ +