feat: consider `over_order_allowance` while validating order qty
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index 2415aec..d9ff981 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -69,6 +69,7 @@
 		self.validate_with_previous_doc()
 		self.validate_for_subcontracting()
 		self.validate_minimum_order_qty()
+		self.validate_against_blanket_order()
 
 		if self.is_old_subcontracting_flow:
 			self.validate_bom_for_subcontracting_items()
@@ -197,6 +198,33 @@
 					).format(item_code, qty, itemwise_min_order_qty.get(item_code))
 				)
 
+	def validate_against_blanket_order(self):
+		po_data = {}
+		for item in self.get("items"):
+			if item.against_blanket_order and item.blanket_order:
+				if item.blanket_order in po_data:
+					if item.item_code in po_data[item.blanket_order]:
+						po_data[item.blanket_order][item.item_code] += item.qty
+					else:
+						po_data[item.blanket_order][item.item_code] = item.qty
+				else:
+					po_data[item.blanket_order] = {item.item_code: item.qty}
+
+		if po_data:
+			allowance = flt(frappe.db.get_single_value("Buying Settings", "over_order_allowance"))
+			for bo_name, item_data in po_data.items():
+				bo_doc = frappe.get_doc("Blanket Order", bo_name)
+				for item in bo_doc.get("items"):
+					if item.item_code in item_data:
+						remaining_qty = item.qty - item.ordered_qty
+						allowed_qty = remaining_qty + (remaining_qty * (allowance / 100))
+						if allowed_qty < item_data[item.item_code]:
+							frappe.throw(
+								_(
+									f"Item {item.item_code} cannot be ordered more than {allowed_qty} against Blanket Order {bo_name}."
+								)
+							)
+
 	def validate_bom_for_subcontracting_items(self):
 		for item in self.items:
 			if not item.bom: