fix: misc fixes in demo data

- Generate demo data field copy
- absolute imports
- remove whitelisting where it's not required
- telemetry
- banner copy
- move to background
- clear bootinfo after setup
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index e3bea25..9e271c9 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -78,7 +78,11 @@
 	"customer",
 	"supplier",
 ]
-demo_transaction_doctypes = ["purchase_invoice", "sales_invoice", "payment_entry", "journal_entry"]
+demo_transaction_doctypes = [
+	"purchase_invoice",
+	"sales_invoice",
+	"payment_entry",
+]
 
 jinja = {
 	"methods": [
diff --git a/erpnext/public/js/setup_wizard.js b/erpnext/public/js/setup_wizard.js
index bcad6eb..ba200ef 100644
--- a/erpnext/public/js/setup_wizard.js
+++ b/erpnext/public/js/setup_wizard.js
@@ -40,7 +40,12 @@
 			{ fieldname: 'fy_start_date', label: __('Financial Year Begins On'), fieldtype: 'Date', reqd: 1 },
 			// end date should be hidden (auto calculated)
 			{ fieldname: 'fy_end_date', label: __('End Date'), fieldtype: 'Date', reqd: 1, hidden: 1 },
-			{ fieldname: 'setup_demo', label: __('Generate dummy data for demo'), fieldtype: 'Check'},
+			{ fieldtype: "Section Break" },
+			{
+				fieldname: 'setup_demo',
+				label: __('Generate Demo Data for Exploration'),
+				fieldtype: 'Check',
+				description: 'If checked, we will create demo data for you to explore the system. This demo data can be erased later.'},
 		],
 
 		onload: function (slide) {
diff --git a/erpnext/public/js/utils/demo.js b/erpnext/public/js/utils/demo.js
index 22d78d8..e810c37 100644
--- a/erpnext/public/js/utils/demo.js
+++ b/erpnext/public/js/utils/demo.js
@@ -2,15 +2,19 @@
 	if (frappe.boot.sysdefaults.demo_company) {
 		erpnext.setup_clear_button();
 	}
+
+	// for first load
+	frappe.realtime.on("demo_data_complete", () => {
+		erpnext.setup_clear_button();
+	})
 });
 
 erpnext.setup_clear_button = function() {
-	let message_string = __('Demo data is setup, use this button to clear before starting actual transactions');
+	let message_string = __("Demo data is present on the system, erase data before starting real usage.");
 	let $floatingBar = $(`
 		<div class="flex justify-content-center" style="width: 100%;">
 			<div class="flex justify-content-center flex-col shadow rounded p-2"
 					style="
-						width: 50%;
 						background-color: #e0f2fe;
 						position: fixed;
 						bottom: 20px;
@@ -34,7 +38,7 @@
 						margin-right: 10px
 					"
 				>
-					Clear
+					Clear Demo Data
 				</button>
 			</div>
 		</div>
@@ -54,4 +58,4 @@
 			}
 		})
 	});
-}
\ No newline at end of file
+}
diff --git a/erpnext/setup/demo.py b/erpnext/setup/demo.py
index 50bc43d..355c373 100644
--- a/erpnext/setup/demo.py
+++ b/erpnext/setup/demo.py
@@ -13,15 +13,26 @@
 from erpnext.setup.setup_wizard.operations.install_fixtures import create_bank_account
 
 
-@frappe.whitelist()
 def setup_demo_data():
-	company = create_demo_company()
-	process_masters()
-	make_transactions(company)
+	from frappe.utils.telemetry import capture
+
+	capture("demo_data_creation_started", "erpnext")
+	try:
+		company = create_demo_company()
+		process_masters()
+		make_transactions(company)
+		frappe.cache.delete_keys("bootinfo")
+		frappe.publish_realtime("demo_data_complete")
+	except Exception:
+		frappe.log_error("Failed to create demo data")
+		capture("demo_data_creation_failed", "erpnext", properties={"exception": frappe.get_traceback()})
+		raise
+	capture("demo_data_creation_completed", "erpnext")
 
 
 @frappe.whitelist()
 def clear_demo_data():
+	frappe.only_for("System Manager")
 	company = frappe.db.get_single_value("Global Defaults", "demo_company")
 	create_transaction_deletion_record(company)
 	clear_masters()
diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py
index ad49be6..ebd7d1e 100644
--- a/erpnext/setup/setup_wizard/setup_wizard.py
+++ b/erpnext/setup/setup_wizard/setup_wizard.py
@@ -5,8 +5,8 @@
 import frappe
 from frappe import _
 
-from ..demo import setup_demo_data
-from .operations import install_fixtures as fixtures
+from erpnext.setup.demo import setup_demo_data
+from erpnext.setup.setup_wizard.operations import install_fixtures as fixtures
 
 
 def get_setup_stages(args=None):
@@ -40,7 +40,7 @@
 			{
 				"status": _("Setting up demo data"),
 				"fail_msg": _("Failed to setup demo data"),
-				"tasks": [{"fn": setup_demo, "args": args, "fail_msg": _("Failed to login")}],
+				"tasks": [{"fn": setup_demo, "args": args, "fail_msg": _("Failed to setup demo data")}],
 			},
 			{
 				"status": _("Wrapping up"),
@@ -71,7 +71,7 @@
 
 def setup_demo(args):
 	if args.get("setup_demo"):
-		setup_demo_data()
+		frappe.enqueue(setup_demo_data, enqueue_after_commit=True)
 
 
 def login_as_first_user(args):