chore: allow manually submitting and cancelling asset depr schedule
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index d69777a..f592a43 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -289,7 +289,7 @@
 				for row in asset.get("finance_books"):
 					depr_schedule = get_draft_or_active_depr_schedule(asset.name, row.finance_book)
 
-					for s in depr_schedule:
+					for s in depr_schedule or []:
 						if s.journal_entry == self.name:
 							s.db_set("journal_entry", None)
 
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index b9274b1..c2bfb12 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -395,7 +395,7 @@
 		for row in self.get("finance_books"):
 			depr_schedule = get_draft_or_active_depr_schedule(self.name, row.finance_book)
 
-			for d in depr_schedule:
+			for d in depr_schedule or []:
 				if d.journal_entry:
 					frappe.get_doc("Journal Entry", d.journal_entry).cancel()
 					d.db_set("journal_entry", None)
@@ -903,6 +903,7 @@
 		)
 		new_asset_depr_schedule_doc.notes = notes
 
+		current_asset_depr_schedule_doc.flags.should_not_cancel_depreciation_entries = True
 		current_asset_depr_schedule_doc.cancel()
 
 		new_asset_depr_schedule_doc.submit()
diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json
index f6f594c..af09cda 100644
--- a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json
+++ b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json
@@ -65,8 +65,7 @@
    "fieldname": "finance_book",
    "fieldtype": "Link",
    "label": "Finance Book",
-   "options": "Finance Book",
-   "read_only": 1
+   "options": "Finance Book"
   },
   {
    "fieldname": "depreciation_method",
@@ -115,7 +114,8 @@
   {
    "fieldname": "notes",
    "fieldtype": "Small Text",
-   "label": "Notes"
+   "label": "Notes",
+   "read_only": 1
   },
   {
    "fieldname": "status",
@@ -133,7 +133,6 @@
    "read_only": 1
   },
   {
-   "default": "0",
    "fieldname": "expected_value_after_useful_life",
    "fieldtype": "Currency",
    "label": "Expected Value After Useful Life",
@@ -157,11 +156,10 @@
    "read_only": 1
   }
  ],
- "in_create": 1,
  "index_web_pages_for_search": 1,
  "is_submittable": 1,
  "links": [],
- "modified": "2022-12-26 20:32:43.342271",
+ "modified": "2023-01-02 15:38:30.766779",
  "modified_by": "Administrator",
  "module": "Assets",
  "name": "Asset Depreciation Schedule",
diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py
index 7a35013..2076976 100644
--- a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py
+++ b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py
@@ -18,6 +18,12 @@
 
 
 class AssetDepreciationSchedule(Document):
+	def before_save(self):
+		if not self.finance_book_id:
+			self.prepare_draft_asset_depr_schedule_data_from_asset_name_and_fb_name(
+				self.asset, self.finance_book
+			)
+
 	def validate(self):
 		self.validate_another_asset_depr_schedule_does_not_exist()
 
@@ -45,9 +51,33 @@
 	def on_submit(self):
 		self.db_set("status", "Active")
 
+	def before_cancel(self):
+		if not self.flags.should_not_cancel_depreciation_entries:
+			self.cancel_depreciation_entries()
+
+	def cancel_depreciation_entries(self):
+		for d in self.get("depreciation_schedule"):
+			if d.journal_entry:
+				frappe.get_doc("Journal Entry", d.journal_entry).cancel()
+
 	def on_cancel(self):
 		self.db_set("status", "Cancelled")
 
+	def prepare_draft_asset_depr_schedule_data_from_asset_name_and_fb_name(self, asset_name, fb_name):
+		asset_doc = frappe.get_doc("Asset", asset_name)
+
+		finance_book_filter = ["finance_book", "is", "not set"]
+		if fb_name:
+			finance_book_filter = ["finance_book", "=", fb_name]
+
+		asset_finance_book_name = frappe.db.get_value(
+			doctype="Asset Finance Book",
+			filters=[["parent", "=", asset_name], finance_book_filter],
+		)
+		asset_finance_book_doc = frappe.get_doc("Asset Finance Book", asset_finance_book_name)
+
+		prepare_draft_asset_depr_schedule_data(self, asset_doc, asset_finance_book_doc)
+
 
 def make_draft_asset_depr_schedules_if_not_present(asset_doc):
 	for row in asset_doc.get("finance_books"):
@@ -138,7 +168,8 @@
 		if not asset_depr_schedule_doc:
 			continue
 
-		asset_depr_schedule_doc.cancel()
+		if asset_depr_schedule_doc.status == "Active":
+			asset_depr_schedule_doc.cancel()
 
 
 def make_new_active_asset_depr_schedules_and_cancel_current_ones(
@@ -163,6 +194,7 @@
 
 		new_asset_depr_schedule_doc.notes = notes
 
+		current_asset_depr_schedule_doc.flags.should_not_cancel_depreciation_entries = True
 		current_asset_depr_schedule_doc.cancel()
 
 		new_asset_depr_schedule_doc.submit()
diff --git a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
index 90ecfec..fe4b7f9 100644
--- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
+++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
@@ -124,6 +124,7 @@
 			new_asset_depr_schedule_doc.status = "Draft"
 			new_asset_depr_schedule_doc.docstatus = 0
 
+			current_asset_depr_schedule_doc.flags.should_not_cancel_depreciation_entries = True
 			current_asset_depr_schedule_doc.cancel()
 
 			notes = _(