blob: 15d5f9a49d1060059dc4ecb11729cec0966b80a6 [file] [log] [blame]
pranav nachnekar27910542019-09-03 12:04:52 +05301import frappe
2import datetime
3
4@frappe.whitelist(allow_guest=True)
5def get_appointment_settings():
6 settings = frappe.get_doc('Appointment Booking Settings')
7 return settings
8
9@frappe.whitelist(allow_guest=True)
10def get_holiday_list(holiday_list_name):
11 holiday_list = frappe.get_doc('Holiday List',holiday_list_name)
12 return holiday_list
13
14@frappe.whitelist(allow_guest=True)
15def get_timezones():
16 timezones = frappe.get_list('Timezone',fields='*')
17 return timezones
18
19@frappe.whitelist(allow_guest=True)
20def get_appointment_slots(date,timezone):
21 timezone = int(timezone)
22 format_string = '%Y-%m-%d %H:%M:%S'
23 query_start_time = datetime.datetime.strptime(date + ' 00:00:00',format_string)
24 query_end_time = datetime.datetime.strptime(date + ' 23:59:59',format_string)
25 query_start_time = _convert_to_ist(query_start_time,timezone)
26 query_end_time = _convert_to_ist(query_end_time,timezone)
27 # Database queries
28 settings = frappe.get_doc('Appointment Booking Settings')
29 holiday_list = frappe.get_doc('Holiday List', settings.holiday_list)
30 timeslots = get_available_slots_between(query_start_time, query_end_time, settings)
31
32 # Filter timeslots based on date
33 converted_timeslots = []
34 for timeslot in timeslots:
35 # Check if holiday
36 if _is_holiday(timeslot.date(),holiday_list):
37 converted_timeslots.append(dict(time=_convert_to_tz(timeslot,timezone),availability=False))
38 continue
39 # Check availability
40 if check_availabilty(timeslot,settings):
41 converted_timeslots.append(dict(time=_convert_to_tz(timeslot,timezone),availability=True))
42 else:
43 converted_timeslots.append(dict(time=_convert_to_tz(timeslot,timezone),availability=False))
44 date_required = datetime.datetime.strptime(date + ' 00:00:00',format_string).date()
45 converted_timeslots = filter_timeslots(date_required,converted_timeslots)
46 return converted_timeslots
47
48def get_available_slots_between(query_start_time, query_end_time, settings):
49 records = _get_records(query_start_time, query_end_time, settings)
50 timeslots = []
51 appointment_duration = datetime.timedelta(
52 minutes=settings.appointment_duration)
53 for record in records:
54 if record.day_of_week == WEEKDAYS[query_start_time.weekday()]:
55 current_time = _deltatime_to_datetime(
56 query_start_time, record.from_time)
57 end_time = _deltatime_to_datetime(
58 query_start_time, record.to_time)
59 else :
60 current_time = _deltatime_to_datetime(
61 query_end_time, record.from_time)
62 end_time = _deltatime_to_datetime(
63 query_end_time, record.to_time)
64 while current_time + appointment_duration <= end_time:
65 timeslots.append(current_time)
66 current_time += appointment_duration
67 return timeslots
68
69@frappe.whitelist(allow_guest=True)
70def create_appointment(date,time,contact):
71
72 appointment = frappe.frappe.get_doc('Appointment')
73 appointment.scheduled_time = date
74
75def filter_timeslots(date,timeslots):
76 filtered_timeslots = []
77 for timeslot in timeslots:
78 if(timeslot['time'].date() == date):
79 filtered_timeslots.append(timeslot)
80 return filtered_timeslots
81
82def check_availabilty(timeslot,settings):
83 return frappe.db.count('Appointment',{'scheduled_time':timeslot})<settings.number_of_agents
84
85
86
87def _is_holiday(date, holiday_list):
88 for holiday in holiday_list.holidays:
89 if holiday.holiday_date == date:
90 return True
91 return False
92
93def _get_records(start_time, end_time, settings):
94 records = []
95 for record in settings.availability_of_slots:
96 if record.day_of_week == WEEKDAYS[start_time.weekday()] or record.day_of_week == WEEKDAYS[end_time.weekday()]:
97 records.append(record)
98 return records
99
100def _deltatime_to_datetime(date, deltatime):
101 time = (datetime.datetime.min + deltatime).time()
102 return datetime.datetime.combine(date.date(), time)
103
104def _datetime_to_deltatime(date_time):
105 midnight = datetime.datetime.combine(date_time.date(),datetime.time.min)
106 return (date_time-midnight)
107
108def _convert_to_ist(datetime_object, timezone):
109 offset = datetime.timedelta(minutes=timezone)
110 datetime_object = datetime_object + offset
111 offset = datetime.timedelta(minutes=-330)
112 datetime_object = datetime_object - offset
113 return datetime_object
114
115def _convert_to_tz(datetime_object, timezone):
116 offset = datetime.timedelta(minutes=timezone)
117 datetime_object = datetime_object - offset
118 offset = datetime.timedelta(minutes=-330)
119 datetime_object = datetime_object + offset
120 return datetime_object
121
122WEEKDAYS = ["Monday", "Tuesday", "Wednesday",
123 "Thursday", "Friday", "Saturday", "Sunday"]