diff --git a/erpnext/www/book-appointment/1.html b/erpnext/www/book-appointment/1.html
deleted file mode 100644
index da4fb25..0000000
--- a/erpnext/www/book-appointment/1.html
+++ /dev/null
@@ -1,38 +0,0 @@
-{% 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" 
-                onchange="ondatechange()"
-                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
deleted file mode 100644
index 9f6c487..0000000
--- a/erpnext/www/book-appointment/1.js
+++ /dev/null
@@ -1,25 +0,0 @@
-
-{% include 'erpnext/public/js/date_polyfill.js' %}
-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")
-    }
-    if(date === ""){
-        frappe.throw("Please select a date")
-    }
-    let tz = document.getElementsByName('appointment-timezone')[0].value;
-    window.location = `/book-appointment/2?date=${date}&tz=${tz}`;
-}
-
-function ondatechange(){
-    let date = document.getElementById('appointment-date')
-    if(holidays.includes(date.value)){
-        frappe.throw("That day is a holiday")
-    }
-}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/1.py b/erpnext/www/book-appointment/1.py
deleted file mode 100644
index 95169b9..0000000
--- a/erpnext/www/book-appointment/1.py
+++ /dev/null
@@ -1,17 +0,0 @@
-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
deleted file mode 100644
index 2a8c5c9..0000000
--- a/erpnext/www/book-appointment/2.html
+++ /dev/null
@@ -1,60 +0,0 @@
-{% 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">
-            {% for timeslot in timeslots %}
-                <div class="col-md time-slot {% if timeslot.unavailable %}unavailable{% endif %}" id="{{ timeslot.time.time() }}">{{ timeslot.time.time().strftime('%H : %M') }}</div>
-            {% endfor %}
-        </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
deleted file mode 100644
index 113564a..0000000
--- a/erpnext/www/book-appointment/2.js
+++ /dev/null
@@ -1,31 +0,0 @@
-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)
-    try{
-        selected_element = document.getElementsByClassName('selected')[0]
-    }catch(e){
-        this.classList.add('selected')
-    }
-    selected_element.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
deleted file mode 100644
index fa8aafa..0000000
--- a/erpnext/www/book-appointment/2.py
+++ /dev/null
@@ -1,93 +0,0 @@
-import frappe
-import datetime
-
-
-def get_context(context):
-    # Get query parameters
-    date = frappe.form_dict['date']
-    tz = frappe.form_dict['tz']
-    tz = int(tz)
-    # Database queries
-    settings = frappe.get_doc('Appointment Booking Settings')
-    holiday_list = frappe.get_doc('Holiday List', settings.holiday_list)
-    # Format datetimes
-    format_string = '%Y-%m-%d %H:%M:%S'
-    start_time = datetime.datetime.strptime(date+' 00:00:00', format_string)
-    end_time = datetime.datetime.strptime(date+' 23:59:59', format_string)
-    # Convert to ist
-    start_time = _convert_to_ist(start_time, tz)
-    end_time = _convert_to_ist(end_time, tz)
-    timeslots = get_available_slots_between(start_time, end_time, settings)
-    converted_timeslots = []
-    print('Appointments')
-    print(frappe.get_list('Appointment',fields=['from_time']))
-    for timeslot in timeslots:
-        if timeslot > end_time or timeslot < start_time:
-            pass
-        else:
-            if frappe.db.count('Appointment',{'from_time':start_time.time()}) < settings.number_of_agents:
-                converted_timeslots.append(dict(time=_convert_to_tz(timeslot, tz), unavailable=False))
-            else:
-                converted_timeslots.append(dict(time=_convert_to_tz(timeslot, tz),unavailable=True))
-
-    context.timeslots = converted_timeslots
-    context.date = date
-    return context
-
-def _is_holiday(date, holiday_list):
-    for holiday in holiday_list.holidays:
-        if holiday.holiday_date.isoformat() == date:
-            return True
-    return False
-
-def _convert_to_ist(datetime_object, timezone):
-    offset = datetime.timedelta(minutes=timezone)
-    datetime_object = datetime_object + offset
-    offset = datetime.timedelta(minutes=-330)
-    datetime_object = datetime_object - offset
-    return datetime_object
-
-def _convert_to_tz(datetime_object, timezone):
-    offset = datetime.timedelta(minutes=timezone)
-    datetime_object = datetime_object - offset
-    offset = datetime.timedelta(minutes=-330)
-    datetime_object = datetime_object + offset
-    return datetime_object
-
-def get_available_slots_between(start_time_parameter, end_time_parameter, settings):
-    records = get_records(start_time_parameter, end_time_parameter, settings)
-    timeslots = []
-    appointment_duration = datetime.timedelta(
-        minutes=settings.appointment_duration)
-    for record in records:
-        if record.day_of_week == weekdays[start_time_parameter.weekday()]:
-            current_time = _deltatime_to_datetime(
-                start_time_parameter, record.from_time)
-            end_time = _deltatime_to_datetime(
-                start_time_parameter, record.to_time)
-        elif record.day_of_week == weekdays[end_time_parameter.weekday()]:
-            current_time = _deltatime_to_datetime(
-                end_time_parameter, record.from_time)
-            end_time = _deltatime_to_datetime(
-                end_time_parameter, record.to_time)
-        while current_time + appointment_duration <= end_time:
-            timeslots.append(current_time)
-            current_time += appointment_duration
-    return timeslots
-
-
-def get_records(start_time, end_time, settings):
-    records = []
-    for record in settings.availability_of_slots:
-        if record.day_of_week == weekdays[start_time.weekday()] or record.day_of_week == weekdays[end_time.weekday()]:
-            records.append(record)
-    return records
-
-
-def _deltatime_to_datetime(date, deltatime):
-    time = (datetime.datetime.min + deltatime).time()
-    return datetime.datetime.combine(date.date(), time)
-
-
-weekdays = ["Monday", "Tuesday", "Wednesday",
-            "Thursday", "Friday", "Saturday", "Sunday"]
diff --git a/erpnext/www/book-appointment/3.html b/erpnext/www/book-appointment/3.html
deleted file mode 100644
index b627a0c..0000000
--- a/erpnext/www/book-appointment/3.html
+++ /dev/null
@@ -1,22 +0,0 @@
-{% 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
deleted file mode 100644
index 23c55a3..0000000
--- a/erpnext/www/book-appointment/3.js
+++ /dev/null
@@ -1,11 +0,0 @@
-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
diff --git a/erpnext/www/book-appointment/index.css b/erpnext/www/book-appointment/index.css
new file mode 100644
index 0000000..3ffe996
--- /dev/null
+++ b/erpnext/www/book-appointment/index.css
@@ -0,0 +1,25 @@
+.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;
+}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/index.html b/erpnext/www/book-appointment/index.html
new file mode 100644
index 0000000..b705f9e
--- /dev/null
+++ b/erpnext/www/book-appointment/index.html
@@ -0,0 +1,70 @@
+{% extends "templates/web.html" %}
+
+{% block title %}{{ _("Book Appointment") }}{% endblock %}
+
+{% block page_content %}
+<div class="container">
+    <!-- title: Book an appointment -->
+    <div id="select-date">
+        <div class="text-center mb-5">
+            <h3>Book an appointment</h3>
+            <p class="lead">Select the date and your timezone</p>
+        </div>
+        <div class="row justify-content-center mt-3">
+            <div class="col-md-4 align-self-center ">
+                <form name="myform">
+                    <input type="date" onchange="validate_date()" name="appointment-date" id="appointment-date"
+                        class="form-control mt-3">
+                    <select name="appointment-timezone" id="appointment-timezone" class="form-control mt-3">
+                    </select>
+                </form>
+                <button class="form-control mt-3 btn btn-dark" id="next-button" onclick="navigate_to_time_select()">
+                    Next
+                </button>
+            </div>
+        </div>
+    </div>
+
+    <!--Select Time Slot-->
+    <div id="select-time">
+        <div class="text-center mb-5">
+            <h3>Pick A Time Slot</h3>
+            <p class="lead">Selected date is <span class="date-span">Date Span</span></p>
+        </div>
+        <div class="mt-3 justify-content-center">
+            <div class="row" id="timeslot-container">
+                
+            </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="initialise_enter_details()">
+                        Next
+                    </button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!--Enter Details-->
+    <div id="enter-details">
+        <div class="text-center mb-5">
+            <h3>Add details</h3>
+            <p class="lead">Selected date is <span class="date-span">Date Span</span> at <span class="time-span"> time </span></p>
+        </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>
+</div>
+
+{% endblock %}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/index.js b/erpnext/www/book-appointment/index.js
new file mode 100644
index 0000000..1482c51
--- /dev/null
+++ b/erpnext/www/book-appointment/index.js
@@ -0,0 +1,146 @@
+
+frappe.ready(() => {
+    initialise_select_date()
+})
+var holiday_list = [];
+
+function navigator(page_no) {
+    let select_date_div = document.getElementById('select-date');
+    select_date_div.style.display = 'none';
+    let select_time_div = document.getElementById('select-time');
+    select_time_div.style.display = 'none';
+    let contact_details_div = document.getElementById('enter-details');
+    contact_details_div.style.display = 'none';
+    let page;
+    switch (page_no) {
+        case 1: page = select_date_div; break;
+        case 2: page = select_time_div; break;
+        case 3: page = contact_details_div; break;
+    }
+    page.style.display = 'block'
+}
+
+// Page 1
+async function initialise_select_date() {
+    navigator(1);
+    let timezones, settings;
+    settings = (await frappe.call({
+        method: 'erpnext.www.book-appointment.index.get_appointment_settings'
+    })).message
+    timezones = (await frappe.call({
+        method: 'erpnext.www.book-appointment.index.get_timezones'
+    })).message;
+    holiday_list = (await frappe.call({
+        method: 'erpnext.www.book-appointment.index.get_holiday_list',
+        args: {
+            'holiday_list_name': settings.holiday_list
+        }
+    })).message;
+    let date_picker = document.getElementById('appointment-date');
+    date_picker.max = holiday_list.to_date;
+    date_picker.min = holiday_list.from_date;
+    date_picker.value = (new Date()).toISOString().substr(0, 10);
+    let timezones_element = document.getElementById('appointment-timezone');
+    var offset = new Date().getTimezoneOffset();
+    timezones.forEach(timezone => {
+        var opt = document.createElement('option');
+        opt.value = timezone.offset;
+        opt.innerHTML = timezone.timezone_name;
+        opt.defaultSelected = (offset == timezone.offset)
+        timezones_element.appendChild(opt)
+    });
+}
+
+function validate_date() {
+    let date_picker = document.getElementById('appointment-date');
+    if (date_picker.value === '') {
+        frappe.throw('Please select a date')
+    }
+}
+
+// Page 2
+async function navigate_to_time_select() {
+    navigator(2);
+    timezone = document.getElementById('appointment-timezone').value
+    date = document.getElementById('appointment-date').value;
+    var date_spans = document.getElementsByClassName('date-span');
+    for (var i = 0; i < date_spans.length; i++) date_spans[i].innerHTML = date;
+    // date_span.addEventListener('click',initialise_select_date)
+    // date_span.style.color = '#5e64ff';
+    // date_span.style.textDecoration = 'underline';
+    // date_span.style.cursor = 'pointer';
+    var slots = (await frappe.call({
+        method: 'erpnext.www.book-appointment.index.get_appointment_slots',
+        args: {
+            date: date,
+            timezone: timezone
+        }
+    })).message;
+    let timeslot_container = document.getElementById('timeslot-container');
+    console.log(slots)
+    if (slots.length <= 0) {
+        let message_div = document.createElement('p');
+        
+        message_div.innerHTML = "There are no slots available on this date";
+        timeslot_container.appendChild(message_div);
+    }
+    for (let i = 0; i < slots.length; i++) {
+        const slot = slots[i];
+        var timeslot_div = document.createElement('div');
+        timeslot_div.classList.add('time-slot');
+        timeslot_div.classList.add('col-md');
+        if (!slot.availability) {
+            timeslot_div.classList.add('unavailable')
+        }
+        timeslot_div.innerHTML = slot.time.substr(11, 20);
+        timeslot_div.id = slot.time.substr(11, 20);
+        timeslot_container.appendChild(timeslot_div);
+    }
+    set_default_timeslot()
+    let time_slot_divs = document.getElementsByClassName('time-slot');
+    for (var i = 0; i < time_slot_divs.length; i++) {
+        time_slot_divs[i].addEventListener('click', select_time);
+    }
+}
+
+function select_time() {
+    if (this.classList.contains("unavailable")) {
+        return
+    }
+    try {
+        selected_element = document.getElementsByClassName('selected')[0]
+    } catch (e) {
+        this.classList.add("selected")
+    }
+    selected_element.classList.remove("selected");
+    this.classList.add("selected");
+}
+
+function set_default_timeslot() {
+    let timeslots = document.getElementsByClassName('time-slot')
+    for (let i = 0; i < timeslots.length; i++) {
+        const timeslot = timeslots[i];
+        if (!timeslot.classList.contains('unavailable')) {
+            timeslot.classList.add("selected");
+            break;
+        }
+    }
+}
+
+function initialise_enter_details() {
+    navigator(3);
+    let time_div = document.getElementsByClassName('selected')[0];
+    let time_span = document.getElementsByClassName('time-span')[0];
+    time_span.innerHTML = time_div.id
+}
+
+function submit() {
+    var date = document.getElementById('appointment-date').value;
+    var time = document.getElementsByClassName('selected')[0].id;
+    contact = {};
+    contact.name = document.getElementById('customer_name').value;
+    contact.number = document.getElementById('customer_number').value;
+    contact.skype = document.getElementById('customer_skype').value;
+    contact.notes = document.getElementById('customer_notes').value;
+    console.log({ date, time, contact });
+} 
diff --git a/erpnext/www/book-appointment/index.py b/erpnext/www/book-appointment/index.py
new file mode 100644
index 0000000..15d5f9a
--- /dev/null
+++ b/erpnext/www/book-appointment/index.py
@@ -0,0 +1,123 @@
+import frappe
+import datetime
+
+@frappe.whitelist(allow_guest=True)
+def get_appointment_settings():
+    settings = frappe.get_doc('Appointment Booking Settings')
+    return settings
+
+@frappe.whitelist(allow_guest=True)
+def get_holiday_list(holiday_list_name):
+    holiday_list = frappe.get_doc('Holiday List',holiday_list_name)
+    return holiday_list
+
+@frappe.whitelist(allow_guest=True)
+def get_timezones():
+    timezones = frappe.get_list('Timezone',fields='*')
+    return timezones
+
+@frappe.whitelist(allow_guest=True)
+def get_appointment_slots(date,timezone):
+    timezone = int(timezone)
+    format_string = '%Y-%m-%d %H:%M:%S'
+    query_start_time = datetime.datetime.strptime(date + ' 00:00:00',format_string)
+    query_end_time = datetime.datetime.strptime(date + ' 23:59:59',format_string)
+    query_start_time = _convert_to_ist(query_start_time,timezone)
+    query_end_time = _convert_to_ist(query_end_time,timezone) 
+    # Database queries
+    settings = frappe.get_doc('Appointment Booking Settings')
+    holiday_list = frappe.get_doc('Holiday List', settings.holiday_list)
+    timeslots = get_available_slots_between(query_start_time, query_end_time, settings)
+    
+    # Filter timeslots based on date
+    converted_timeslots = []
+    for timeslot in timeslots:
+        # Check if holiday
+        if _is_holiday(timeslot.date(),holiday_list):
+            converted_timeslots.append(dict(time=_convert_to_tz(timeslot,timezone),availability=False))
+            continue
+        # Check availability
+        if check_availabilty(timeslot,settings):
+            converted_timeslots.append(dict(time=_convert_to_tz(timeslot,timezone),availability=True))
+        else:
+            converted_timeslots.append(dict(time=_convert_to_tz(timeslot,timezone),availability=False))
+    date_required = datetime.datetime.strptime(date + ' 00:00:00',format_string).date()
+    converted_timeslots = filter_timeslots(date_required,converted_timeslots)
+    return converted_timeslots
+
+def get_available_slots_between(query_start_time, query_end_time, settings):
+    records = _get_records(query_start_time, query_end_time, settings)
+    timeslots = []
+    appointment_duration = datetime.timedelta(
+        minutes=settings.appointment_duration)
+    for record in records:
+        if record.day_of_week == WEEKDAYS[query_start_time.weekday()]:
+            current_time = _deltatime_to_datetime(
+                query_start_time, record.from_time)
+            end_time = _deltatime_to_datetime(
+                query_start_time, record.to_time)
+        else :
+            current_time = _deltatime_to_datetime(
+                query_end_time, record.from_time)
+            end_time = _deltatime_to_datetime(
+                query_end_time, record.to_time)
+        while current_time + appointment_duration <= end_time:
+            timeslots.append(current_time)
+            current_time += appointment_duration
+    return timeslots
+
+@frappe.whitelist(allow_guest=True) 
+def create_appointment(date,time,contact):
+    
+    appointment = frappe.frappe.get_doc('Appointment')
+    appointment.scheduled_time = date
+
+def filter_timeslots(date,timeslots):
+    filtered_timeslots = []
+    for timeslot in timeslots:
+        if(timeslot['time'].date() == date):
+            filtered_timeslots.append(timeslot)
+    return filtered_timeslots
+
+def check_availabilty(timeslot,settings):
+    return frappe.db.count('Appointment',{'scheduled_time':timeslot})<settings.number_of_agents
+
+        
+
+def _is_holiday(date, holiday_list):
+    for holiday in holiday_list.holidays:
+        if holiday.holiday_date == date:
+            return True
+    return False
+
+def _get_records(start_time, end_time, settings):
+    records = []
+    for record in settings.availability_of_slots:
+        if record.day_of_week == WEEKDAYS[start_time.weekday()] or record.day_of_week == WEEKDAYS[end_time.weekday()]:
+            records.append(record)
+    return records
+
+def _deltatime_to_datetime(date, deltatime):
+    time = (datetime.datetime.min + deltatime).time()
+    return datetime.datetime.combine(date.date(), time)
+
+def _datetime_to_deltatime(date_time):
+    midnight = datetime.datetime.combine(date_time.date(),datetime.time.min)
+    return (date_time-midnight)
+
+def _convert_to_ist(datetime_object, timezone):
+    offset = datetime.timedelta(minutes=timezone)
+    datetime_object = datetime_object + offset
+    offset = datetime.timedelta(minutes=-330)
+    datetime_object = datetime_object - offset
+    return datetime_object
+
+def _convert_to_tz(datetime_object, timezone):
+    offset = datetime.timedelta(minutes=timezone)
+    datetime_object = datetime_object - offset
+    offset = datetime.timedelta(minutes=-330)
+    datetime_object = datetime_object + offset
+    return datetime_object
+
+WEEKDAYS = ["Monday", "Tuesday", "Wednesday",
+            "Thursday", "Friday", "Saturday", "Sunday"]
\ No newline at end of file
