From c1312700e892313dceb3433d1e72d3047ac3c8a0 Mon Sep 17 00:00:00 2001 From: Pranav Nachnekar Date: Tue, 28 Jan 2020 12:20:47 +0000 Subject: [PATCH] feat: create appoitnemnt against customer (#20457) --- .../crm/doctype/appointment/appointment.js | 9 +++++ .../crm/doctype/appointment/appointment.json | 25 +++++++++----- .../crm/doctype/appointment/appointment.py | 33 ++++++++++++++----- erpnext/www/book_appointment/index.js | 22 +++++++++++++ 4 files changed, 72 insertions(+), 17 deletions(-) diff --git a/erpnext/crm/doctype/appointment/appointment.js b/erpnext/crm/doctype/appointment/appointment.js index 8888b569c46..ca38121b1cf 100644 --- a/erpnext/crm/doctype/appointment/appointment.js +++ b/erpnext/crm/doctype/appointment/appointment.js @@ -13,5 +13,14 @@ frappe.ui.form.on('Appointment', { 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 32df8ec4295..8517ddec321 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" ], @@ -61,12 +63,6 @@ "options": "Open\nUnverified\nClosed", "reqd": 1 }, - { - "fieldname": "lead", - "fieldtype": "Link", - "label": "Lead", - "options": "Lead" - }, { "fieldname": "calendar_event", "fieldtype": "Link", @@ -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 f50293043b1..1988bb61696 100644 --- a/erpnext/crm/doctype/appointment/appointment.py +++ b/erpnext/crm/doctype/appointment/appointment.py @@ -24,6 +24,14 @@ class Appointment(Document): 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 @@ class Appointment(Document): 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 @@ class Appointment(Document): 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 @@ class Appointment(Document): }) 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 @@ class Appointment(Document): 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 @@ class Appointment(Document): '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 262e31b3e40..377a3cc0973 100644 --- a/erpnext/www/book_appointment/index.js +++ b/erpnext/www/book_appointment/index.js @@ -181,10 +181,32 @@ function setup_details_page() { 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;