From 6183b380890a3a5445ac3277d63ba945efd6738e Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Wed, 19 Feb 2025 13:01:27 +0530 Subject: [PATCH] fix: validate if no matching item found (cherry picked from commit 44c1425e73b89b1f82f88e3b84743a630841f08e) --- erpnext/assets/doctype/asset/asset.js | 4 +-- erpnext/assets/doctype/asset/asset.py | 35 ++++++++++++++++++--------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js index 769356843db..d5ebbc9df28 100644 --- a/erpnext/assets/doctype/asset/asset.js +++ b/erpnext/assets/doctype/asset/asset.js @@ -660,9 +660,9 @@ frappe.ui.form.on("Asset", { frm.set_value("purchase_invoice_item", data.purchase_invoice_item); } - let is_editable = !data.is_multiple_items; // if multiple items, then fields should not be read-only + let is_editable = !data.is_multiple_items; // if multiple items, then fields should be read-only frm.set_df_property("gross_purchase_amount", "read_only", is_editable); - frm.set_df_property("asset_quantity", "read_only", !is_editable); + frm.set_df_property("asset_quantity", "read_only", is_editable); } }, }); diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index 15ed3d0723a..d89a33f9d4e 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -205,29 +205,40 @@ class Asset(AccountsController): return self.purchase_amount = self.gross_purchase_amount - purchase_type = "Purchase Receipt" if self.purchase_receipt else "Purchase Invoice" + purchase_doc_type = "Purchase Receipt" if self.purchase_receipt else "Purchase Invoice" purchase_doc = self.purchase_receipt or self.purchase_invoice if not purchase_doc: return - purchase_doc = frappe.get_doc(purchase_type, purchase_doc) + linked_item = self.get_linked_item(purchase_doc_type, purchase_doc) + + if linked_item: + if purchase_doc_type == "Purchase Receipt": + self.purchase_receipt_item = linked_item + else: + self.purchase_invoice_item = linked_item + + def get_linked_item(self, purchase_doc_type, purchase_doc): + purchase_doc = frappe.get_doc(purchase_doc_type, purchase_doc) for item in purchase_doc.items: if self.asset_quantity > 1: if item.base_net_amount == self.gross_purchase_amount and item.qty == self.asset_quantity: - self.purchase_receipt_item = item.name if purchase_type == "Purchase Receipt" else None - self.purchase_invoice_item = item.name if purchase_type == "Purchase Invoice" else None - return + return item.name elif item.qty == self.asset_quantity: - self.purchase_receipt_item = item.name if purchase_type == "Purchase Receipt" else None - self.purchase_invoice_item = item.name if purchase_type == "Purchase Invoice" else None - return + return item.name else: - if item.base_net_rate == self.gross_purchase_amount: - self.purchase_receipt_item = item.name if purchase_type == "Purchase Receipt" else None - self.purchase_invoice_item = item.name if purchase_type == "Purchase Invoice" else None - return + if item.base_net_rate == self.gross_purchase_amount and item.qty == self.asset_quantity: + return item.name + + # If no matching item found, raise validation error + frappe.throw( + _( + "No matching item found in {0} with item code {1}. " + "Please verify the purchase details and ensure the correct amount and quantity is recorded." + ).format(purchase_doc_type, self.item_code) + ) def validate_asset_and_reference(self): if self.purchase_invoice or self.purchase_receipt: