From f12319b123b3c984e841423ecfab85e62de1db81 Mon Sep 17 00:00:00 2001 From: ljain112 Date: Fri, 28 Nov 2025 19:09:54 +0530 Subject: [PATCH] perf: enhance validation for purchase invoices to check submission status for all invoices (cherry picked from commit 0b84d116005f7ca81b0e04c405cc43c1bfe9c3e0) --- .../doctype/asset_repair/asset_repair.py | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.py b/erpnext/assets/doctype/asset_repair/asset_repair.py index 3347c7bd972..9c25f390b74 100644 --- a/erpnext/assets/doctype/asset_repair/asset_repair.py +++ b/erpnext/assets/doctype/asset_repair/asset_repair.py @@ -85,19 +85,37 @@ class AssetRepair(AccountsController): ) def validate_purchase_invoices(self): + self.validate_purchase_invoice_status() + for d in self.invoices: - self.validate_purchase_invoice_status(d.purchase_invoice) self.validate_expense_account(d) self.validate_purchase_invoice_repair_cost(d) - def validate_purchase_invoice_status(self, purchase_invoice): - docstatus = frappe.db.get_value("Purchase Invoice", purchase_invoice, "docstatus") - if docstatus == 0: - frappe.throw( - _("{0} is still in Draft. Please submit it before saving the Asset Repair.").format( - get_link_to_form("Purchase Invoice", purchase_invoice) - ) + def validate_purchase_invoice_status(self): + pi_names = [row.purchase_invoice for row in self.invoices] + docstatus = frappe._dict( + frappe.db.get_all( + "Purchase Invoice", + filters={"name": ["in", pi_names]}, + fields=["name", "docstatus"], + as_list=True, ) + ) + + invalid_invoice = [] + for row in self.invoices: + if docstatus.get(row.purchase_invoice) != 1: + invalid_invoice.append((row.idx, row.purchase_invoice)) + + if invalid_invoice: + invoice_links = "".join( + [ + f"
  • {_('Row #{0}:').format(idx)} {get_link_to_form('Purchase Invoice', pi)}
  • " + for idx, pi in invalid_invoice + ] + ) + msg = _("The following Purchase Invoices are not submitted:") + f"
    " + frappe.throw(msg) def validate_expense_account(self, row): """Validate that the expense account exists in the purchase invoice for non-stock items."""