refactor: make sure only one task is running for doc
diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js
index ed70ebb..ccf09a6 100644
--- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js
+++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js
@@ -24,7 +24,7 @@
 			frm.add_custom_button(execute_btn, () => {
 				// Entry point for chain of events
 				frm.call({
-					method: 'delete_bins',
+					method: 'process_tasks',
 					doc: frm.doc
 				});
 			});
diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py
index 71892bb..be161e3 100644
--- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py
+++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py
@@ -1,6 +1,7 @@
 # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors
 # For license information, please see license.txt
 
+from collections import OrderedDict
 
 import frappe
 from frappe import _, qb
@@ -42,15 +43,17 @@
 	def __init__(self, *args, **kwargs):
 		super(TransactionDeletionRecord, self).__init__(*args, **kwargs)
 		self.batch_size = 5000
-		# Tasks are listged by their execution order
-		self.task_to_internal_method_map = {
-			"Delete Bins": "delete_bins",
-			"Delete Leads and Addresses": "delete_lead_addresses",
-			"Reset Company Values": "reset_company_values",
-			"Clear Notifications": "delete_notifications",
-			"Initialize Summary Table": "initialize_doctypes_to_be_deleted_table",
-			"Delete Transactions": "delete_company_transactions",
-		}
+		# Tasks are listed by their execution order
+		self.task_to_internal_method_map = OrderedDict(
+			{
+				"Delete Bins": "delete_bins",
+				"Delete Leads and Addresses": "delete_lead_addresses",
+				"Reset Company Values": "reset_company_values",
+				"Clear Notifications": "delete_notifications",
+				"Initialize Summary Table": "initialize_doctypes_to_be_deleted_table",
+				"Delete Transactions": "delete_company_transactions",
+			}
+		)
 
 	def validate(self):
 		frappe.only_for("System Manager")
@@ -71,10 +74,19 @@
 		method = self.task_to_internal_method_map[task]
 		return f"{self.name}_{method}"
 
+	def generate_job_name_for_next_tasks(self, task=None):
+		job_names = []
+		current_task_idx = list(self.task_to_internal_method_map).index(task)
+		for idx, task in enumerate(self.task_to_internal_method_map.keys(), 0):
+			# generate job_name for next tasks
+			if idx > current_task_idx:
+				job_names.append(self.generate_job_name_for_task(task))
+		return job_names
+
 	def generate_job_name_for_all_tasks(self):
 		job_names = []
-		for method in self.task_to_internal_method_map.values():
-			job_names.append(self.generate_job_name_for_task)
+		for task in self.task_to_internal_method_map.keys():
+			job_names.append(self.generate_job_name_for_task(task))
 		return job_names
 
 	def before_submit(self):
@@ -116,6 +128,10 @@
 
 	def chain_call(self, task=None):
 		if task and task in self.task_to_internal_method_map:
+			# make sure that none of next tasks are already running
+			job_names = self.generate_job_name_for_next_tasks(task=task)
+			self.validate_running_task_for_doc(job_names=job_names)
+
 			method = self.task_to_internal_method_map[task]
 			job_id = self.generate_job_name_for_task(task)
 
@@ -162,15 +178,15 @@
 					get_link_to_form("Transaction Deletion Record", self.name)
 				)
 			)
-		# make sure that job none of tasks are already running
-		job_names = self.generate_job_name_for_all_tasks()
-		self.validate_running_task_for_doc(job_names=job_names)
 
 	@frappe.whitelist()
-	def delete_bins(self):
-		# This methid is the entry point for the chain of events that follow
+	def process_tasks(self):
+		# This method is the entry point for the chain of events that follow
 		self.db_set("status", "Running")
+		self.chain_call(task="Delete Bins")
 
+	def delete_bins(self):
+		self.validate_doc_status()
 		if not self.delete_bin_data:
 			frappe.db.sql(
 				"""delete from `tabBin` where warehouse in