pranav nachnekar | 7b9e309 | 2019-08-28 16:57:37 +0530 | [diff] [blame] | 1 | import frappe |
| 2 | import datetime |
| 3 | |
| 4 | |
| 5 | def get_context(context): |
pranav nachnekar | dbd72ea | 2019-08-29 16:56:19 +0530 | [diff] [blame] | 6 | # Get query parameters |
| 7 | date = frappe.form_dict['date'] |
| 8 | tz = frappe.form_dict['tz'] |
| 9 | tz = int(tz) |
| 10 | # Database queries |
pranav nachnekar | 7b9e309 | 2019-08-28 16:57:37 +0530 | [diff] [blame] | 11 | settings = frappe.get_doc('Appointment Booking Settings') |
| 12 | holiday_list = frappe.get_doc('Holiday List', settings.holiday_list) |
pranav nachnekar | dbd72ea | 2019-08-29 16:56:19 +0530 | [diff] [blame] | 13 | # Format datetimes |
| 14 | format_string = '%Y-%m-%d %H:%M:%S' |
| 15 | start_time = datetime.datetime.strptime(date+' 00:00:00', format_string) |
| 16 | end_time = datetime.datetime.strptime(date+' 23:59:59', format_string) |
| 17 | # Convert to ist |
| 18 | start_time = _convert_to_ist(start_time, tz) |
| 19 | end_time = _convert_to_ist(end_time, tz) |
| 20 | timeslots = get_available_slots_between(start_time, end_time, settings) |
| 21 | converted_timeslots = [] |
| 22 | print('Appointments') |
| 23 | print(frappe.get_list('Appointment',fields=['from_time'])) |
| 24 | for timeslot in timeslots: |
| 25 | if timeslot > end_time or timeslot < start_time: |
| 26 | pass |
| 27 | else: |
| 28 | if frappe.db.count('Appointment',{'from_time':start_time.time()}) < settings.number_of_agents: |
| 29 | converted_timeslots.append(dict(time=_convert_to_tz(timeslot, tz), unavailable=False)) |
| 30 | else: |
| 31 | converted_timeslots.append(dict(time=_convert_to_tz(timeslot, tz),unavailable=True)) |
| 32 | |
| 33 | context.timeslots = converted_timeslots |
| 34 | context.date = date |
pranav nachnekar | 7b9e309 | 2019-08-28 16:57:37 +0530 | [diff] [blame] | 35 | return context |
| 36 | |
pranav nachnekar | dbd72ea | 2019-08-29 16:56:19 +0530 | [diff] [blame] | 37 | def _is_holiday(date, holiday_list): |
pranav nachnekar | 7b9e309 | 2019-08-28 16:57:37 +0530 | [diff] [blame] | 38 | for holiday in holiday_list.holidays: |
| 39 | if holiday.holiday_date.isoformat() == date: |
pranav nachnekar | 7b9e309 | 2019-08-28 16:57:37 +0530 | [diff] [blame] | 40 | return True |
| 41 | return False |
| 42 | |
pranav nachnekar | dbd72ea | 2019-08-29 16:56:19 +0530 | [diff] [blame] | 43 | def _convert_to_ist(datetime_object, timezone): |
| 44 | offset = datetime.timedelta(minutes=timezone) |
| 45 | datetime_object = datetime_object + offset |
| 46 | offset = datetime.timedelta(minutes=-330) |
| 47 | datetime_object = datetime_object - offset |
| 48 | return datetime_object |
| 49 | |
| 50 | def _convert_to_tz(datetime_object, timezone): |
| 51 | offset = datetime.timedelta(minutes=timezone) |
| 52 | datetime_object = datetime_object - offset |
| 53 | offset = datetime.timedelta(minutes=-330) |
| 54 | datetime_object = datetime_object + offset |
| 55 | return datetime_object |
| 56 | |
| 57 | def get_available_slots_between(start_time_parameter, end_time_parameter, settings): |
| 58 | records = get_records(start_time_parameter, end_time_parameter, settings) |
| 59 | timeslots = [] |
| 60 | appointment_duration = datetime.timedelta( |
| 61 | minutes=settings.appointment_duration) |
| 62 | for record in records: |
| 63 | if record.day_of_week == weekdays[start_time_parameter.weekday()]: |
| 64 | current_time = _deltatime_to_datetime( |
| 65 | start_time_parameter, record.from_time) |
| 66 | end_time = _deltatime_to_datetime( |
| 67 | start_time_parameter, record.to_time) |
| 68 | elif record.day_of_week == weekdays[end_time_parameter.weekday()]: |
| 69 | current_time = _deltatime_to_datetime( |
| 70 | end_time_parameter, record.from_time) |
| 71 | end_time = _deltatime_to_datetime( |
| 72 | end_time_parameter, record.to_time) |
| 73 | while current_time + appointment_duration <= end_time: |
| 74 | timeslots.append(current_time) |
| 75 | current_time += appointment_duration |
| 76 | return timeslots |
pranav nachnekar | 7b9e309 | 2019-08-28 16:57:37 +0530 | [diff] [blame] | 77 | |
| 78 | |
pranav nachnekar | dbd72ea | 2019-08-29 16:56:19 +0530 | [diff] [blame] | 79 | def get_records(start_time, end_time, settings): |
| 80 | records = [] |
| 81 | for record in settings.availability_of_slots: |
| 82 | if record.day_of_week == weekdays[start_time.weekday()] or record.day_of_week == weekdays[end_time.weekday()]: |
| 83 | records.append(record) |
| 84 | return records |
pranav nachnekar | 7b9e309 | 2019-08-28 16:57:37 +0530 | [diff] [blame] | 85 | |
pranav nachnekar | dbd72ea | 2019-08-29 16:56:19 +0530 | [diff] [blame] | 86 | |
| 87 | def _deltatime_to_datetime(date, deltatime): |
| 88 | time = (datetime.datetime.min + deltatime).time() |
| 89 | return datetime.datetime.combine(date.date(), time) |
| 90 | |
| 91 | |
| 92 | weekdays = ["Monday", "Tuesday", "Wednesday", |
| 93 | "Thursday", "Friday", "Saturday", "Sunday"] |