Merge branch 'develop' of https://github.com/frappe/erpnext into develop
diff --git a/erpnext/crm/doctype/appointment/__init__.py b/erpnext/crm/doctype/appointment/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/crm/doctype/appointment/__init__.py
diff --git a/erpnext/crm/doctype/appointment/appointment.js b/erpnext/crm/doctype/appointment/appointment.js
new file mode 100644
index 0000000..4e41047
--- /dev/null
+++ b/erpnext/crm/doctype/appointment/appointment.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Appointment', {
+ // refresh: function(frm) {
+
+ // }
+});
diff --git a/erpnext/crm/doctype/appointment/appointment.json b/erpnext/crm/doctype/appointment/appointment.json
new file mode 100644
index 0000000..24cbd92
--- /dev/null
+++ b/erpnext/crm/doctype/appointment/appointment.json
@@ -0,0 +1,91 @@
+{
+ "autoname": "format:APMT-{appointment_date}-{####}",
+ "creation": "2019-08-27 10:48:27.926283",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "from_time",
+ "to_time",
+ "appointment_date",
+ "customer_details_section",
+ "customer_name",
+ "customer_phone_number",
+ "customer_skype",
+ "customer_details"
+ ],
+ "fields": [
+ {
+ "fieldname": "from_time",
+ "fieldtype": "Time",
+ "in_list_view": 1,
+ "label": "From Time",
+ "reqd": 1
+ },
+ {
+ "fieldname": "to_time",
+ "fieldtype": "Time",
+ "in_list_view": 1,
+ "label": "To Tme",
+ "reqd": 1
+ },
+ {
+ "fieldname": "appointment_date",
+ "fieldtype": "Date",
+ "in_list_view": 1,
+ "label": "Date ",
+ "reqd": 1
+ },
+ {
+ "fieldname": "customer_details_section",
+ "fieldtype": "Section Break",
+ "label": "Customer Details"
+ },
+ {
+ "fieldname": "customer_name",
+ "fieldtype": "Data",
+ "in_list_view": 1,
+ "label": "Name",
+ "reqd": 1
+ },
+ {
+ "fieldname": "customer_phone_number",
+ "fieldtype": "Data",
+ "label": "Phone Number"
+ },
+ {
+ "fieldname": "customer_skype",
+ "fieldtype": "Data",
+ "label": "Skype ID"
+ },
+ {
+ "fieldname": "customer_details",
+ "fieldtype": "Long Text",
+ "label": "Details"
+ }
+ ],
+ "modified": "2019-08-27 12:43:30.143937",
+ "modified_by": "Administrator",
+ "module": "CRM",
+ "name": "Appointment",
+ "name_case": "UPPER CASE",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "System Manager",
+ "share": 1,
+ "write": 1
+ }
+ ],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/appointment/appointment.py b/erpnext/crm/doctype/appointment/appointment.py
new file mode 100644
index 0000000..204b066
--- /dev/null
+++ b/erpnext/crm/doctype/appointment/appointment.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+# import frappe
+from frappe.model.document import Document
+
+class Appointment(Document):
+ pass
diff --git a/erpnext/crm/doctype/appointment/test_appointment.py b/erpnext/crm/doctype/appointment/test_appointment.py
new file mode 100644
index 0000000..702ac71
--- /dev/null
+++ b/erpnext/crm/doctype/appointment/test_appointment.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+# import frappe
+import unittest
+
+class TestAppointment(unittest.TestCase):
+ pass
diff --git a/erpnext/crm/doctype/appointment_booking_settings/__init__.py b/erpnext/crm/doctype/appointment_booking_settings/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/crm/doctype/appointment_booking_settings/__init__.py
diff --git a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.js b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.js
new file mode 100644
index 0000000..465df2c
--- /dev/null
+++ b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.js
@@ -0,0 +1,18 @@
+// frappe.ui.form.on('Availability Of Slots', 'from_time', check_time)
+// frappe.ui.form.on('Availability Of Slots', 'to_time', check_time)
+
+frappe.ui.form.on('Appointment Booking Settings', 'validate',check_times)
+function check_times(frm) {
+ $.each(frm.doc.availability_of_slots || [], function (i, d) {
+ let from_time = Date.parse('01/01/2019 ' + d.from_time);
+ console.log(from_time);
+ let to_time = Date.parse('01/01/2019 ' + d.to_time);
+ if (from_time > to_time) {
+ frappe.throw(__(`In row ${i + 1} of Availability Of Slots : "To Time" must be later than "From Time"`))
+ }
+ })
+}
+// function check_times(frm, cdt, cdn) {
+ // let d = locals[cdt][cdn];
+//
+// }
\ No newline at end of file
diff --git a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json
new file mode 100644
index 0000000..ed6150a
--- /dev/null
+++ b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json
@@ -0,0 +1,72 @@
+{
+ "creation": "2019-08-27 10:56:48.309824",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "availability_of_slots",
+ "number_of_agents",
+ "holiday_list",
+ "email_reminders",
+ "appointment_duration"
+ ],
+ "fields": [
+ {
+ "fieldname": "availability_of_slots",
+ "fieldtype": "Table",
+ "label": "Availability Of Slots",
+ "options": "Availability Of Slots",
+ "reqd": 1
+ },
+ {
+ "fieldname": "number_of_agents",
+ "fieldtype": "Int",
+ "in_list_view": 1,
+ "label": "No. Of Agents",
+ "reqd": 1
+ },
+ {
+ "fieldname": "holiday_list",
+ "fieldtype": "Link",
+ "in_list_view": 1,
+ "label": "Holiday List",
+ "options": "Holiday List",
+ "reqd": 1
+ },
+ {
+ "default": "0",
+ "fieldname": "email_reminders",
+ "fieldtype": "Check",
+ "label": "Email Reminders"
+ },
+ {
+ "default": "60",
+ "fieldname": "appointment_duration",
+ "fieldtype": "Int",
+ "label": "Appointment Duration",
+ "reqd": 1
+ }
+ ],
+ "issingle": 1,
+ "modified": "2019-08-27 17:32:46.208951",
+ "modified_by": "Administrator",
+ "module": "CRM",
+ "name": "Appointment Booking Settings",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "print": 1,
+ "read": 1,
+ "role": "System Manager",
+ "share": 1,
+ "write": 1
+ }
+ ],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py
new file mode 100644
index 0000000..3307636
--- /dev/null
+++ b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+# import frappe
+from frappe.model.document import Document
+
+class AppointmentBookingSettings(Document):
+ pass
diff --git a/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py b/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py
new file mode 100644
index 0000000..3dc3c39
--- /dev/null
+++ b/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+# import frappe
+import unittest
+
+class TestAppointmentBookingSettings(unittest.TestCase):
+ pass
diff --git a/erpnext/crm/doctype/availability_of_slots/__init__.py b/erpnext/crm/doctype/availability_of_slots/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/crm/doctype/availability_of_slots/__init__.py
diff --git a/erpnext/crm/doctype/availability_of_slots/availability_of_slots.json b/erpnext/crm/doctype/availability_of_slots/availability_of_slots.json
new file mode 100644
index 0000000..d26f7ce
--- /dev/null
+++ b/erpnext/crm/doctype/availability_of_slots/availability_of_slots.json
@@ -0,0 +1,46 @@
+{
+ "creation": "2019-08-27 10:52:54.204677",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "day_of_week",
+ "from_time",
+ "to_time"
+ ],
+ "fields": [
+ {
+ "fieldname": "day_of_week",
+ "fieldtype": "Select",
+ "in_list_view": 1,
+ "label": "Day Of Week",
+ "options": "Sunday\nMonday\nTuesday\nWednesday\nThursday\nFriday\nSaturday",
+ "reqd": 1
+ },
+ {
+ "fieldname": "from_time",
+ "fieldtype": "Time",
+ "in_list_view": 1,
+ "label": "From Time ",
+ "reqd": 1
+ },
+ {
+ "fieldname": "to_time",
+ "fieldtype": "Time",
+ "in_list_view": 1,
+ "label": "To Time",
+ "reqd": 1
+ }
+ ],
+ "istable": 1,
+ "modified": "2019-08-27 10:52:54.204677",
+ "modified_by": "Administrator",
+ "module": "CRM",
+ "name": "Availabilty Of Slots",
+ "owner": "Administrator",
+ "permissions": [],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/availability_of_slots/availability_of_slots.py b/erpnext/crm/doctype/availability_of_slots/availability_of_slots.py
new file mode 100644
index 0000000..8258471
--- /dev/null
+++ b/erpnext/crm/doctype/availability_of_slots/availability_of_slots.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+# import frappe
+from frappe.model.document import Document
+
+class AvailabilityOfSlots(Document):
+ pass
diff --git a/erpnext/crm/doctype/timezone/__init__.py b/erpnext/crm/doctype/timezone/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/crm/doctype/timezone/__init__.py
diff --git a/erpnext/crm/doctype/timezone/test_timezone.py b/erpnext/crm/doctype/timezone/test_timezone.py
new file mode 100644
index 0000000..92a8889
--- /dev/null
+++ b/erpnext/crm/doctype/timezone/test_timezone.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+# import frappe
+import unittest
+
+class TestTimezone(unittest.TestCase):
+ pass
diff --git a/erpnext/crm/doctype/timezone/timezone.js b/erpnext/crm/doctype/timezone/timezone.js
new file mode 100644
index 0000000..4dc57db
--- /dev/null
+++ b/erpnext/crm/doctype/timezone/timezone.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Timezone', {
+ // refresh: function(frm) {
+
+ // }
+});
diff --git a/erpnext/crm/doctype/timezone/timezone.json b/erpnext/crm/doctype/timezone/timezone.json
new file mode 100644
index 0000000..9eb8ed9
--- /dev/null
+++ b/erpnext/crm/doctype/timezone/timezone.json
@@ -0,0 +1,52 @@
+{
+ "autoname": "field:timezone_name",
+ "creation": "2019-08-27 11:39:30.328670",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "offset",
+ "timezone_name"
+ ],
+ "fields": [
+ {
+ "fieldname": "offset",
+ "fieldtype": "Int",
+ "in_list_view": 1,
+ "label": "Offset In Minutes",
+ "reqd": 1
+ },
+ {
+ "fieldname": "timezone_name",
+ "fieldtype": "Data",
+ "in_list_view": 1,
+ "label": "Name",
+ "reqd": 1,
+ "unique": 1
+ }
+ ],
+ "modified": "2019-08-27 11:39:30.328670",
+ "modified_by": "Administrator",
+ "module": "CRM",
+ "name": "Timezone",
+ "name_case": "Title Case",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "System Manager",
+ "share": 1,
+ "write": 1
+ }
+ ],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/timezone/timezone.py b/erpnext/crm/doctype/timezone/timezone.py
new file mode 100644
index 0000000..20e7d37
--- /dev/null
+++ b/erpnext/crm/doctype/timezone/timezone.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+# import frappe
+from frappe.model.document import Document
+
+class Timezone(Document):
+ pass
diff --git a/erpnext/www/book-appointment/1.html b/erpnext/www/book-appointment/1.html
new file mode 100644
index 0000000..db4ef26
--- /dev/null
+++ b/erpnext/www/book-appointment/1.html
@@ -0,0 +1,31 @@
+{% extends "templates/web.html" %}
+
+{% block title %}{{ _("Book Appointment") }}{% endblock %}
+
+{% block page_content %}
+<div class="container">
+ <!-- title: Book an appointment -->
+ <div class="text-center mb-5">
+ <h3>Book an appointment</h3>
+ <h4>Select the date and your timezone</h4>
+ </div>
+ <div class="row justify-content-center mt-3">
+ <div class="col-md-4 align-self-center ">
+ <form name="myform">
+ <input type="date" name="appointment-date" id="appointment-date" class="form-control mt-3" min="{{ from_date }}" max="{{ to_date }}">
+ <select name="appointment-timezone" id="appointment-timezone" class="form-control mt-3">
+ {% if timezones %}
+ {% for timezone in timezones%}
+ <option value="{{timezone.offset}}">{{timezone.timezone_name}}</option>
+ {% endfor %}
+ {% endif %}
+ </select>
+ </form>
+ <button class="form-control mt-3 btn btn-dark" id="next-button" onclick="next()">
+ Next
+ </button>
+ </div>
+ </div>
+</div>
+
+{% endblock %}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/1.js b/erpnext/www/book-appointment/1.js
new file mode 100644
index 0000000..d05c253
--- /dev/null
+++ b/erpnext/www/book-appointment/1.js
@@ -0,0 +1,14 @@
+
+let holidays = [];
+{% if holidays %}
+ holidays = {{holidays}}
+{% endif %}
+
+function next() {
+ let date = document.getElementsByName('appointment-date')[0].value;
+ if(holidays.includes(date)){
+ frappe.throw("That day is a holiday")
+ }
+ let tz = document.getElementsByName('appointment-timezone')[0].value;
+ window.location = `/book-appointment/2?date=${date}&tz=${tz}`;
+}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/1.py b/erpnext/www/book-appointment/1.py
new file mode 100644
index 0000000..95169b9
--- /dev/null
+++ b/erpnext/www/book-appointment/1.py
@@ -0,0 +1,17 @@
+import frappe
+
+def get_context(context):
+ settings = frappe.get_doc('Appointment Booking Settings')
+ holiday_list = frappe.get_doc('Holiday List',settings.holiday_list)
+ holidays = []
+ for holiday in holiday_list.holidays:
+ print(str(holiday.holiday_date))
+ holidays.append(str(holiday.holiday_date))
+ context.holidays = holidays
+ context.from_date = holiday_list.from_date
+ context.to_date = holiday_list.to_date
+ timezones = frappe.get_all('Timezone',fields=["timezone_name","offset"])
+ context.timezones = timezones
+
+ return context
+
diff --git a/erpnext/www/book-appointment/2.html b/erpnext/www/book-appointment/2.html
new file mode 100644
index 0000000..198b12d
--- /dev/null
+++ b/erpnext/www/book-appointment/2.html
@@ -0,0 +1,85 @@
+{% extends "templates/web.html" %}
+
+{% block title %}{{ _("Book Appointment") }}{% endblock %}
+
+{% block page_content %}
+<style>
+ .time-slot {
+ margin: 0 0;
+ border: 0.5px solid #cccccc;
+ min-height: 100px;
+ }
+
+ .time-slot:hover {
+ background: #ddd;
+ }
+
+ .time-slot.unavailable {
+ background: #bbb;
+
+ color: #777777
+ }
+
+ input[type="radio"] {
+ visibility: hidden;
+ display: none;
+ }
+
+ .time-slot.selected {
+ color: white;
+ background: #5e64ff;
+ }
+</style>
+<div class="container">
+ <div class="text-center mb-5">
+ {% if is_holiday %}
+ <h3> This day is a holiday</h3>
+ {% else %}
+ <h3>Pick A Time Slot</h3>
+ <h4>Selected date is {{ date }}</h4>
+ </div>
+ <!-- Start of main content-->
+
+ <div class="mt-3 justify-content-center">
+ <div class="row">
+ <div class="col-md time-slot unavailable" id="12pm">12 pm to 1 am</div>
+ <div class="col-md time-slot selected" id="1am">1 am to 2 am</div>
+ <div class="col-md time-slot" id="2am">2 am to 3 am</div>
+ <div class="col-md time-slot" id="3am">3 am to 4 am</div>
+ <div class="col-md time-slot" id="4am">4 am to 5 am</div>
+ <div class="col-md time-slot" id="5am">5 am to 6 am</div>
+ <div class="col-md time-slot" id="6am">6 am to 7 am</div>
+ <div class="col-md time-slot" id="7am">7 am to 8 am</div>
+ </div>
+ <div class="row">
+ <div class=" col-md time-slot" id="8am">8 am to 9 am</div>
+ <div class=" col-md time-slot" id="9am">9 am to 10 am</div>
+ <div class=" col-md time-slot" id="10am">10 am to 11 am</div>
+ <div class=" col-md time-slot" id="11am">11 am to 12 am</div>
+ <div class=" col-md time-slot" id="12am">12 am to 1 pm</div>
+ <div class=" col-md time-slot" id="1pm">1 pm to 2 pm</div>
+ <div class=" col-md time-slot" id="2pm">2 pm to 3 pm</div>
+ <div class=" col-md time-slot" id="3pm">3 pm to 4pm</div>
+ </div>
+ <div class="row">
+ <div class=" col-md time-slot" id="4pm">4pm to 5pm</div>
+ <div class=" col-md time-slot" id="5pm">5 pm to 6 pm</div>
+ <div class=" col-md time-slot" id="6pm">6 pm to 7 pm</div>
+ <div class=" col-md time-slot" id="7pm">7 pm to 8 pm</div>
+ <div class=" col-md time-slot" id="8pm">8 pm to 9 pm</div>
+ <div class=" col-md time-slot" id="9pm">9 pm to 10 pm</div>
+ <div class=" col-md time-slot" id="10pm">10 pm to 11 pm</div>
+ <div class=" col-md time-slot" id="11pm">11 pm to 12 pm</div>
+ </div>
+ <div class="row justify-content-center">
+ <div class="col-md-4 align-self-center">
+ <button class="form-control mt-5 btn btn-dark" onclick="next()">
+ Next
+ </button>
+ </div>
+ </div>
+ {% endif %}
+ </div>
+</div>
+<!-- End of main content -->
+{% endblock %}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/2.js b/erpnext/www/book-appointment/2.js
new file mode 100644
index 0000000..bdcabdc
--- /dev/null
+++ b/erpnext/www/book-appointment/2.js
@@ -0,0 +1,27 @@
+let time_slot_divs = document.getElementsByClassName('time-slot');
+
+function get_available_slots() {
+ frappe.db
+}
+
+function select_time() {
+ if (this.classList.contains("unavailable")) {
+ return
+ }
+ console.log(this.id)
+ var selected = document.getElementsByClassName('selected')[0];
+ selected.classList.remove('selected');
+ this.classList.add('selected');
+}
+
+for (var i = 0; i < time_slot_divs.length; i++) {
+ time_slot_divs[i].addEventListener('click', select_time);
+}
+
+function next() {
+ let urlParams = new URLSearchParams(window.location.search);
+ let date = urlParams.get("date");
+ let tz = urlParams.get("tz");
+ let time_slot = document.querySelector(".selected").id;
+ window.location.href = `/book-appointment/3?date=${date}&tz=${tz}&time=${time_slot}`;
+}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/2.py b/erpnext/www/book-appointment/2.py
new file mode 100644
index 0000000..688545a
--- /dev/null
+++ b/erpnext/www/book-appointment/2.py
@@ -0,0 +1,28 @@
+import frappe
+import datetime
+
+
+def get_context(context):
+ context.date = frappe.form_dict['date']
+ settings = frappe.get_doc('Appointment Booking Settings')
+ holiday_list = frappe.get_doc('Holiday List', settings.holiday_list)
+ if(is_holiday(context.date,holiday_list)):
+ context.is_holiday = True
+ return context
+ get_time_slots(context.date,settings)
+ # time_slots = get_time_slots(date)
+ return context
+
+def is_holiday(date,holiday_list):
+ for holiday in holiday_list.holidays:
+ if holiday.holiday_date.isoformat() == date:
+ print('matched')
+ return True
+ return False
+
+
+
+def _deltatime_to_time(deltatime):
+ return (datetime.datetime.min + deltatime).time()
+
+weekdays = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/3.html b/erpnext/www/book-appointment/3.html
new file mode 100644
index 0000000..b627a0c
--- /dev/null
+++ b/erpnext/www/book-appointment/3.html
@@ -0,0 +1,22 @@
+{% extends "templates/web.html" %}
+
+{% block title %}{{ _("Book Appointment") }}{% endblock %}
+
+{% block page_content %}
+<div class="container">
+
+ <div class="text-center mb-5">
+ <h3>Add details</h3>
+ <h4>Selected date is {{ date }} at {{ time }}</h4>
+ </div>
+ <div class="row justify-content-center mt-3">
+ <div class="col-md-4 align-items-center">
+ <input class="form-control mt-3" type="text" name="customer_name" id="customer_name" placeholder="Your Name" required>
+ <input class="form-control mt-3" type="tel" name="customer_number" id="customer_number" placeholder="Contact Number" required>
+ <input class="form-control mt-3" type="text" name="customer_skype" id="customer_skype" placeholder="Skype" required>
+ <textarea class="form-control mt-3" name="customer_notes" id="customer_notes" cols="30" rows="10" placeholder="Notes"></textarea>
+ <button class="btn btn-primary form-control mt-3" onclick="submit()">Submit</button>
+ </div>
+ </div>
+</div>
+{% endblock %}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/3.js b/erpnext/www/book-appointment/3.js
new file mode 100644
index 0000000..23c55a3
--- /dev/null
+++ b/erpnext/www/book-appointment/3.js
@@ -0,0 +1,11 @@
+function submit(){
+ let params = new URLSearchParams(window.location.search);
+ const date = params.get('date');
+ const time = params.get('time');
+ const tz = params.get('tz');
+ const customer_name = document.getElementById('customer_name').value;
+ const customer_number = document.getElementById('customer_number').value;
+ const customer_skype = document.getElementById('customer_skype').value;
+ const customer_notes = document.getElementById('customer_notes').value;
+ console.log({date,time,tz,customer_name,customer_number,customer_skype,customer_notes});
+}
\ No newline at end of file