feat: Schedule status is now updated on submitting a visit.
diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
index d077108..45e632c 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
+++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
@@ -64,6 +64,14 @@
 					});
 				}, __("Get Items From"));
 		} else if (this.frm.doc.docstatus === 1) {
+			var s = me.frm.doc.schedules;
+			let flag = 0
+			for(let i in s){
+				if (s[i].completion_status == pending){
+					flag = 1
+				}
+			}
+			if(count){
 			this.frm.add_custom_button(__('Create Maintenance Visit'), function () {
 				let items = me.frm.doc.items;
 				let s = me.frm.doc.schedules;
@@ -103,7 +111,7 @@
 							let field = d.get_field("scheduled_date");
 							dates = ""
 							for (let i in s) {
-								if (s[i].item_name == this.value) {
+								if (s[i].item_name == this.value && s[i].completion_status == "Pending") {
 									dates = dates + '\n' + formatDate(s[i].scheduled_date);
 								}
 
@@ -154,6 +162,7 @@
 
 			}, __('Create'));
 		}
+	}
 	},
 
 	start_date: function (doc, cdt, cdn) {
diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
index fd06a4e..aa582ee 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
+++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
@@ -33,6 +33,7 @@
 				count = count + 1
 				child.sales_person = d.sales_person
 				child.completion_status = "Pending"
+				child.item_ref = d.name
 
 	def on_submit(self):
 		if not self.get('schedules'):
@@ -171,9 +172,7 @@
 
 	def on_update(self):
 		frappe.db.set(self, 'status', 'Draft')
-
-
-
+	
 	def update_amc_date(self, serial_nos, amc_expiry_date=None):
 		for serial_no in serial_nos:
 			serial_no_doc = frappe.get_doc("Serial No", serial_no)
@@ -255,6 +254,8 @@
 
 	def update_sid(source, target, parent):
 		target.prevdoc_detail_docname = s_id
+		sales_person = frappe.db.get_value('Maintenance Schedule Detail', s_id, 'sales_person')
+		target.service_person = sales_person
 
 	doclist = get_mapped_doc("Maintenance Schedule", source_name, {
 			"Maintenance Schedule": {
@@ -275,7 +276,7 @@
 					},
 					"condition": lambda doc: doc.item_name == item_name,
 
-										"postprocess": update_sid
+					"postprocess": update_sid
 
 			}
 	}, target_doc)
diff --git a/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json b/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json
index 7fda687..f1e2e21 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json
+++ b/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json
@@ -10,10 +10,11 @@
   "item_code",
   "item_name",
   "scheduled_date",
-  "actual_date",
   "sales_person",
+  "actual_date",
+  "completion_status",
   "serial_no",
-  "completion_status"
+  "item_ref"
  ],
  "fields": [
   {
@@ -29,11 +30,9 @@
    "search_index": 1
   },
   {
-   "columns": 2,
    "fieldname": "item_name",
    "fieldtype": "Data",
    "in_global_search": 1,
-   "in_list_view": 1,
    "label": "Item Name",
    "oldfieldname": "item_name",
    "oldfieldtype": "Data",
@@ -71,7 +70,8 @@
    "label": "Sales Person",
    "oldfieldname": "incharge_name",
    "oldfieldtype": "Link",
-   "options": "Sales Person"
+   "options": "Sales Person",
+   "read_only_depends_on": "eval:doc.completion_status != \"Pending\""
   },
   {
    "fieldname": "serial_no",
@@ -85,16 +85,25 @@
    "width": "160px"
   },
   {
+   "columns": 2,
    "fieldname": "completion_status",
    "fieldtype": "Select",
+   "in_list_view": 1,
    "label": "Completion Status",
-   "options": "Pending\nPartially Completed\nFully Completed"
+   "options": "Pending\nPartially Completed\nFully Completed",
+   "read_only": 1
+  },
+  {
+   "fieldname": "item_ref",
+   "fieldtype": "Data",
+   "label": "Item Reference",
+   "read_only": 1
   }
  ],
  "idx": 1,
  "istable": 1,
  "links": [],
- "modified": "2021-04-19 16:18:36.723319",
+ "modified": "2021-04-19 17:42:31.685710",
  "modified_by": "Administrator",
  "module": "Maintenance",
  "name": "Maintenance Schedule Detail",
diff --git a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
index 2f2ad00..9505a36 100644
--- a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
+++ b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
@@ -4,6 +4,7 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
+from frappe.utils import get_datetime
 
 from erpnext.utilities.transaction_base import TransactionBase
 
@@ -16,8 +17,33 @@
 			if d.serial_no and not frappe.db.exists("Serial No", d.serial_no):
 				frappe.throw(_("Serial No {0} does not exist").format(d.serial_no))
 
+	def validate_mntc_date(self):
+		if self.maintenance_type == "Scheduled":
+			p = self.purposes
+			for i in p:
+				detail_ref = i.prevdoc_detail_docname
+			item_ref = frappe.db.get_value('Maintenance Schedule Detail', detail_ref , 'item_ref')
+			start_date, end_date = frappe.db.get_value('Maintenance Schedule Item', item_ref, ['start_date', 'end_date'])
+			if get_datetime(self.mntc_date) < get_datetime(start_date) or get_datetime(self.mntc_date) > get_datetime(end_date):
+				frappe.throw(_("Date must be between {0} and {1}").format(start_date,end_date))
+
 	def validate(self):
 		self.validate_serial_no()
+		self.validate_mntc_date()
+		
+	def update_completion_status(self):
+		if self.maintenance_type == "Scheduled":
+			p = self.purposes
+			for i in p:
+				detail_ref = i.prevdoc_detail_docname
+			frappe.db.set_value('Maintenance Schedule Detail', detail_ref, 'completion_status', self.completion_status)
+	
+	def update_actual_date(self):
+		if self.maintenance_type == "Scheduled":
+			p = self.purposes
+			for i in p:
+				detail_ref = i.prevdoc_detail_docname
+			frappe.db.set_value('Maintenance Schedule Detail', detail_ref, 'actual_date', self.mntc_date)
 
 	def update_customer_issue(self, flag):
 		for d in self.get('purposes'):
@@ -77,6 +103,8 @@
 	def on_submit(self):
 		self.update_customer_issue(1)
 		frappe.db.set(self, 'status', 'Submitted')
+		self.update_completion_status()
+		self.update_actual_date()
 
 	def on_cancel(self):
 		self.check_if_last_visit()