fix: staffing Plan validation (#22379)

diff --git a/erpnext/hr/doctype/job_offer/job_offer.py b/erpnext/hr/doctype/job_offer/job_offer.py
index 32f1b89..9a2c4c6 100644
--- a/erpnext/hr/doctype/job_offer/job_offer.py
+++ b/erpnext/hr/doctype/job_offer/job_offer.py
@@ -20,10 +20,9 @@
 		staffing_plan = get_staffing_plan_detail(self.designation, self.company, self.offer_date)
 		check_vacancies = frappe.get_single("HR Settings").check_vacancies
 		if staffing_plan and check_vacancies:
-			vacancies = frappe.db.get_value("Staffing Plan Detail", filters={"name": staffing_plan.name}, fieldname=['vacancies'])
-			job_offers = len(self.get_job_offer(staffing_plan.from_date, staffing_plan.to_date))
-			if vacancies - job_offers <= 0:
-				frappe.throw(_("There are no vacancies under staffing plan {0}").format(get_link_to_form("Staffing Plan", staffing_plan.parent)))
+			job_offers = self.get_job_offer(staffing_plan.from_date, staffing_plan.to_date)
+			if staffing_plan.vacancies - len(job_offers) <= 0:
+				frappe.throw(_("There are no vacancies under staffing plan {0}").format(frappe.bold(get_link_to_form("Staffing Plan", staffing_plan.parent))))
 
 	def on_change(self):
 		update_job_applicant(self.status, self.job_applicant)
@@ -42,18 +41,22 @@
 
 def get_staffing_plan_detail(designation, company, offer_date):
 	detail = frappe.db.sql("""
-		SELECT spd.name as name,
+		SELECT DISTINCT spd.parent,
 			sp.from_date as from_date,
 			sp.to_date as to_date,
-			sp.name as parent
+			sp.name,
+			sum(spd.vacancies) as vacancies,
+			spd.designation
 		FROM `tabStaffing Plan Detail` spd, `tabStaffing Plan` sp
 		WHERE
 			sp.docstatus=1
 			AND spd.designation=%s
 			AND sp.company=%s
+			AND spd.parent = sp.name
 			AND %s between sp.from_date and sp.to_date
 	""", (designation, company, offer_date), as_dict=1)
-	return detail[0] if detail else None
+
+	return frappe._dict(detail[0]) if detail else None
 
 @frappe.whitelist()
 def make_employee(source_name, target_doc=None):