chore: Clear Progress section for completed logs & `on_submit` UX

- Delete `BOM Update Batch` table on 'Completed' log, to save space
- Hide Progress section on 'Completed' log
- Enqueue `on_submit` for 'Update Cost' job, getting leaf boms could take time for huge DBs. Users have to wait for screen to unfreeze.
- Add error handling to `process_boms_cost_level_wise` (Called via cron job and on submit, both in background)
diff --git a/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.json b/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.json
index c32e383..a926e69 100644
--- a/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.json
+++ b/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.json
@@ -7,11 +7,11 @@
  "editable_grid": 1,
  "engine": "InnoDB",
  "field_order": [
-  "current_bom",
-  "new_bom",
-  "column_break_3",
   "update_type",
   "status",
+  "column_break_3",
+  "current_bom",
+  "new_bom",
   "error_log",
   "progress_section",
   "current_level",
@@ -37,6 +37,7 @@
    "options": "BOM"
   },
   {
+   "depends_on": "eval:doc.update_type === \"Replace BOM\"",
    "fieldname": "column_break_3",
    "fieldtype": "Column Break"
   },
@@ -87,6 +88,7 @@
    "options": "BOM Update Batch"
   },
   {
+   "depends_on": "eval:doc.status !== \"Completed\"",
    "fieldname": "current_level",
    "fieldtype": "Int",
    "label": "Current Level"
@@ -96,7 +98,7 @@
  "index_web_pages_for_search": 1,
  "is_submittable": 1,
  "links": [],
- "modified": "2022-06-06 15:15:23.883251",
+ "modified": "2022-06-20 15:43:55.696388",
  "modified_by": "Administrator",
  "module": "Manufacturing",
  "name": "BOM Update Log",
diff --git a/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py b/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py
index 9c9c240..af5ff8e 100644
--- a/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py
+++ b/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py
@@ -77,7 +77,11 @@
 				now=frappe.flags.in_test,
 			)
 		else:
-			process_boms_cost_level_wise(self)
+			frappe.enqueue(
+				method="erpnext.manufacturing.doctype.bom_update_log.bom_update_log.process_boms_cost_level_wise",
+				update_doc=self,
+				now=frappe.flags.in_test,
+			)
 
 
 def run_replace_bom_job(
@@ -112,28 +116,31 @@
 	current_boms = {}
 	values = {}
 
-	if update_doc.status == "Queued":
-		# First level yet to process. On Submit.
-		current_level = 0
-		current_boms = get_leaf_boms()
-		values = {
-			"processed_boms": json.dumps({}),
-			"status": "In Progress",
-			"current_level": current_level,
-		}
-	else:
-		# Resume next level. via Cron Job.
-		if not parent_boms:
-			return
+	try:
+		if update_doc.status == "Queued":
+			# First level yet to process. On Submit.
+			current_level = 0
+			current_boms = get_leaf_boms()
+			values = {
+				"processed_boms": json.dumps({}),
+				"status": "In Progress",
+				"current_level": current_level,
+			}
+		else:
+			# Resume next level. via Cron Job.
+			if not parent_boms:
+				return
 
-		current_level = cint(update_doc.current_level) + 1
+			current_level = cint(update_doc.current_level) + 1
 
-		# Process the next level BOMs. Stage parents as current BOMs.
-		current_boms = parent_boms.copy()
-		values = {"current_level": current_level}
+			# Process the next level BOMs. Stage parents as current BOMs.
+			current_boms = parent_boms.copy()
+			values = {"current_level": current_level}
 
-	set_values_in_log(update_doc.name, values, commit=True)
-	queue_bom_cost_jobs(current_boms, update_doc, current_level)
+		set_values_in_log(update_doc.name, values, commit=True)
+		queue_bom_cost_jobs(current_boms, update_doc, current_level)
+	except Exception:
+		handle_exception(update_doc)
 
 
 def queue_bom_cost_jobs(
@@ -199,16 +206,22 @@
 		current_boms, processed_boms = get_processed_current_boms(log, bom_batches)
 		parent_boms = get_next_higher_level_boms(child_boms=current_boms, processed_boms=processed_boms)
 
-		# Unset processed BOMs if log is complete, it is used for next level BOMs
+		# Unset processed BOMs (it is used for next level BOMs) & change status if log is complete
+		status = "Completed" if not parent_boms else "In Progress"
+		processed_boms = json.dumps([] if not parent_boms else processed_boms)
 		set_values_in_log(
 			log.name,
 			values={
-				"processed_boms": json.dumps([] if not parent_boms else processed_boms),
-				"status": "Completed" if not parent_boms else "In Progress",
+				"processed_boms": processed_boms,
+				"status": status,
 			},
 			commit=True,
 		)
 
+		# clear progress section
+		if status == "Completed":
+			frappe.db.delete("BOM Update Batch", {"parent": log.name})
+
 		if parent_boms:  # there is a next level to process
 			process_boms_cost_level_wise(
 				update_doc=frappe.get_doc("BOM Update Log", log.name), parent_boms=parent_boms