Merge pull request #23550 from nextchamp-saqib/add-acc-to-a-group-fix

chore: validate is_group of child parent account
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index 2c15144..c801cfc 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -101,7 +101,7 @@
 				return
 			if not frappe.db.get_value("Account",
 				{'account_name': self.account_name, 'company': ancestors[0]}, 'name'):
-				frappe.throw(_("Please add the account to root level Company - %s" % ancestors[0]))
+				frappe.throw(_("Please add the account to root level Company - {}").format(ancestors[0]))
 		elif self.parent_account:
 			descendants = get_descendants_of('Company', self.company)
 			if not descendants: return
@@ -164,9 +164,19 @@
 
 	def create_account_for_child_company(self, parent_acc_name_map, descendants, parent_acc_name):
 		for company in descendants:
+			company_bold = frappe.bold(company)
+			parent_acc_name_bold = frappe.bold(parent_acc_name)
 			if not parent_acc_name_map.get(company):
-				frappe.throw(_("While creating account for child Company {0}, parent account {1} not found. Please create the parent account in corresponding COA")
-					.format(company, parent_acc_name))
+				frappe.throw(_("While creating account for Child Company {0}, parent account {1} not found. Please create the parent account in corresponding COA")
+					.format(company_bold, parent_acc_name_bold), title=_("Account Not Found"))
+
+			# validate if parent of child company account to be added is a group
+			if (frappe.db.get_value("Account", self.parent_account, "is_group")
+				and not frappe.db.get_value("Account", parent_acc_name_map[company], "is_group")):
+				msg = _("While creating account for Child Company {0}, parent account {1} found as a ledger account.").format(company_bold, parent_acc_name_bold)
+				msg += "<br><br>"
+				msg += _("Please convert the parent account in corresponding child company to a group account.")
+				frappe.throw(msg, title=_("Invalid Parent Account"))
 
 			filters = {
 				"account_name": self.account_name,
@@ -309,8 +319,9 @@
 				allow_child_account_creation = _("Allow Account Creation Against Child Company")
 
 				message = _("Account {0} exists in parent company {1}.").format(frappe.bold(old_acc_name), frappe.bold(ancestor))
-				message += "<br>" + _("Renaming it is only allowed via parent company {0}, \
-					to avoid mismatch.").format(frappe.bold(ancestor)) + "<br><br>"
+				message += "<br>"
+				message += _("Renaming it is only allowed via parent company {0}, to avoid mismatch.").format(frappe.bold(ancestor))
+				message += "<br><br>"
 				message += _("To overrule this, enable '{0}' in company {1}").format(allow_child_account_creation, frappe.bold(account.company))
 
 				frappe.throw(message, title=_("Rename Not Allowed"))
diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py
index b6a950b..0605d89 100644
--- a/erpnext/accounts/doctype/account/test_account.py
+++ b/erpnext/accounts/doctype/account/test_account.py
@@ -111,6 +111,17 @@
 		self.assertEqual(acc_tc_4, "Test Sync Account - _TC4")
 		self.assertEqual(acc_tc_5, "Test Sync Account - _TC5")
 
+	def test_add_account_to_a_group(self):
+		frappe.db.set_value("Account", "Office Rent - _TC3", "is_group", 1)
+
+		acc = frappe.new_doc("Account")
+		acc.account_name = "Test Group Account"
+		acc.parent_account = "Office Rent - _TC3"
+		acc.company = "_Test Company 3"
+		self.assertRaises(frappe.ValidationError, acc.insert)
+
+		frappe.db.set_value("Account", "Office Rent - _TC3", "is_group", 0)
+
 	def test_account_rename_sync(self):
 		frappe.local.flags.pop("ignore_root_company_validation", None)
 
@@ -160,6 +171,7 @@
 		for doc in to_delete:
 			frappe.delete_doc("Account", doc)
 
+
 def _make_test_records(verbose):
 	from frappe.test_runner import make_test_objects