feat: merge functionality
diff --git a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py
index bf12ff5..48ac1e7 100644
--- a/erpnext/accounts/doctype/ledger_merge/ledger_merge.py
+++ b/erpnext/accounts/doctype/ledger_merge/ledger_merge.py
@@ -4,5 +4,66 @@
 import frappe
 from frappe.model.document import Document
 
+from erpnext.accounts.doctype.account.account import merge_account
+
+
 class LedgerMerge(Document):
-	pass
+	def start_merge(self):
+		from frappe.core.page.background_jobs.background_jobs import get_info
+		from frappe.utils.background_jobs import enqueue
+		from frappe.utils.scheduler import is_scheduler_inactive
+
+		if is_scheduler_inactive() and not frappe.flags.in_test:
+			frappe.throw(
+				_("Scheduler is inactive. Cannot merge accounts."), title=_("Scheduler Inactive")
+			)
+
+		enqueued_jobs = [d.get("job_name") for d in get_info()]
+
+		if self.name not in enqueued_jobs:
+			enqueue(
+				start_merge,
+				queue="default",
+				timeout=6000,
+				event="ledger_merge",
+				job_name=self.name,
+				docname=self.name,
+				now=frappe.conf.developer_mode or frappe.flags.in_test,
+			)
+			return True
+
+		return False
+
+@frappe.whitelist()
+def form_start_merge(docname):
+	return frappe.get_doc("Ledger Merge", docname).start_merge()
+
+def start_merge(docname):
+	ledger_merge = frappe.get_doc("Ledger Merge", docname)
+	successful_merges = 0
+	total = len(ledger_merge.merge_accounts)
+	for row in ledger_merge.merge_accounts:
+		try:
+			merge_account(row.account, ledger_merge.account, 0, ledger_merge.root_type, ledger_merge.company)
+			row.db_set('merged', 1)
+			frappe.db.commit()
+			successful_merges += 1
+			frappe.publish_realtime("ledger_merge_progress", {
+					"ledger_merge": ledger_merge.name,
+					"current": successful_merges,
+					"total": total
+				}
+			)
+		except Exception:
+			frappe.db.rollback()
+			ledger_merge.db_set("status", "Error")
+			frappe.log_error(title=ledger_merge.name)
+		finally:
+			if successful_merges == total:
+				ledger_merge.db_set('status', 'Success')
+			elif successful_merges > 0:
+				ledger_merge.db_set('status', 'Partial Success')
+			else:
+				ledger_merge.db_set('status', 'Error')
+
+	frappe.publish_realtime("ledger_merge_refresh", {"ledger_merge": ledger_merge.name})