feat: create appoitnemnt against customer (#20457)

diff --git a/erpnext/crm/doctype/appointment/appointment.js b/erpnext/crm/doctype/appointment/appointment.js
index 8888b56..ca38121 100644
--- a/erpnext/crm/doctype/appointment/appointment.js
+++ b/erpnext/crm/doctype/appointment/appointment.js
@@ -13,5 +13,14 @@
 				frappe.set_route("Form", "Event", frm.doc.calendar_event);
 			});
 		}
+	},
+	onload: function(frm){
+		frm.set_query("appointment_with", function(){
+			return {
+				filters : {
+					"name": ["in", ["Customer", "Lead"]]
+				}
+			};
+		});
 	}
 });
diff --git a/erpnext/crm/doctype/appointment/appointment.json b/erpnext/crm/doctype/appointment/appointment.json
index 32df8ec..8517dde 100644
--- a/erpnext/crm/doctype/appointment/appointment.json
+++ b/erpnext/crm/doctype/appointment/appointment.json
@@ -1,4 +1,5 @@
 {
+ "actions": [],
  "autoname": "format:APMT-{customer_name}-{####}",
  "creation": "2019-08-27 10:48:27.926283",
  "doctype": "DocType",
@@ -15,7 +16,8 @@
   "col_br_2",
   "customer_details",
   "linked_docs_section",
-  "lead",
+  "appointment_with",
+  "party",
   "col_br_3",
   "calendar_event"
  ],
@@ -62,12 +64,6 @@
    "reqd": 1
   },
   {
-   "fieldname": "lead",
-   "fieldtype": "Link",
-   "label": "Lead",
-   "options": "Lead"
-  },
-  {
    "fieldname": "calendar_event",
    "fieldtype": "Link",
    "label": "Calendar Event",
@@ -91,9 +87,22 @@
   {
    "fieldname": "col_br_3",
    "fieldtype": "Column Break"
+  },
+  {
+   "fieldname": "appointment_with",
+   "fieldtype": "Link",
+   "label": "Appointment With",
+   "options": "DocType"
+  },
+  {
+   "fieldname": "party",
+   "fieldtype": "Dynamic Link",
+   "label": "Party",
+   "options": "appointment_with"
   }
  ],
- "modified": "2019-10-14 15:23:54.630731",
+ "links": [],
+ "modified": "2020-01-28 16:16:45.447213",
  "modified_by": "Administrator",
  "module": "CRM",
  "name": "Appointment",
diff --git a/erpnext/crm/doctype/appointment/appointment.py b/erpnext/crm/doctype/appointment/appointment.py
index f502930..1988bb6 100644
--- a/erpnext/crm/doctype/appointment/appointment.py
+++ b/erpnext/crm/doctype/appointment/appointment.py
@@ -24,6 +24,14 @@
 			return lead_list[0].name
 		return None
 
+	def find_customer_by_email(self):
+		customer_list = frappe.get_list(
+			'Customer', filters={'email_id': self.customer_email}, ignore_permissions=True
+		)
+		if customer_list:
+			return customer_list[0].name
+		return None
+
 	def before_insert(self):
 		number_of_appointments_in_same_slot = frappe.db.count(
 			'Appointment', filters={'scheduled_time': self.scheduled_time})
@@ -32,11 +40,18 @@
 			if (number_of_appointments_in_same_slot >= number_of_agents):
 				frappe.throw('Time slot is not available')
 		# Link lead
-		if not self.lead:
-			self.lead = self.find_lead_by_email()
+		if not self.party:
+			lead = self.find_lead_by_email()
+			customer = self.find_customer_by_email()
+			if customer:
+				self.appointment_with = "Customer"
+				self.party = customer
+			else:
+				self.appointment_with = "Lead"
+				self.party = lead
 
 	def after_insert(self):
-		if self.lead:
+		if self.party:
 			# Create Calendar event
 			self.auto_assign()
 			self.create_calendar_event()
@@ -89,7 +104,7 @@
 
 	def create_lead_and_link(self):
 		# Return if already linked
-		if self.lead:
+		if self.party:
 			return
 		lead = frappe.get_doc({
 			'doctype': 'Lead',
@@ -100,7 +115,7 @@
 		})
 		lead.insert(ignore_permissions=True)
 		# Link lead
-		self.lead = lead.name
+		self.party = lead.name
 
 	def auto_assign(self):
 		from frappe.desk.form.assign_to import add as add_assignemnt
@@ -129,14 +144,14 @@
 			break
 
 	def get_assignee_from_latest_opportunity(self):
-		if not self.lead:
+		if not self.party:
 			return None
-		if not frappe.db.exists('Lead', self.lead):
+		if not frappe.db.exists('Lead', self.party):
 			return None
 		opporutnities = frappe.get_list(
 			'Opportunity',
 			filters={
-				'party_name': self.lead,
+				'party_name': self.party,
 			},
 			ignore_permissions=True,
 			order_by='creation desc')
@@ -159,7 +174,7 @@
 			'status': 'Open',
 			'type': 'Public',
 			'send_reminder': frappe.db.get_single_value('Appointment Booking Settings', 'email_reminders'),
-			'event_participants': [dict(reference_doctype='Lead', reference_docname=self.lead)]
+			'event_participants': [dict(reference_doctype='Lead', reference_docname=self.party)]
 		})
 		employee = _get_employee_from_user(self._assign)
 		if employee:
diff --git a/erpnext/www/book_appointment/index.js b/erpnext/www/book_appointment/index.js
index 262e31b..377a3cc 100644
--- a/erpnext/www/book_appointment/index.js
+++ b/erpnext/www/book_appointment/index.js
@@ -181,10 +181,32 @@
     navigate_to_page(2)
     let date_container = document.getElementsByClassName('date-span')[0];
     let time_container = document.getElementsByClassName('time-span')[0];
+    setup_search_params();
     date_container.innerHTML = moment(window.selected_date).format("MMM Do YYYY");
     time_container.innerHTML = moment(window.selected_time, "HH:mm:ss").format("LT");
 }
 
+function setup_search_params() {
+    let search_params = new URLSearchParams(window.location.search);
+    let customer_name = search_params.get("name")
+    let customer_email = search_params.get("email")
+    let detail = search_params.get("details")
+    if (customer_name) {
+        let name_input = document.getElementById("customer_name");
+        name_input.value = customer_name;
+        name_input.disabled = true;
+    }
+    if(customer_email) {
+        let email_input = document.getElementById("customer_email");
+        email_input.value = customer_email;
+        email_input.disabled = true;
+    }
+    if(detail) {
+        let detail_input = document.getElementById("customer_notes");
+        detail_input.value = detail;
+        detail_input.disabled = true;
+    }
+}
 async function submit() {
     let button = document.getElementById('submit-button');
     button.disabled = true;