ever-co / ever-gauzy

Ever® Gauzy™ - Open Business Management Platform (ERP/CRM/HRM/ATS/PM) - https://gauzy.co
https://gauzy.co
GNU Affero General Public License v3.0
2.3k stars 551 forks source link

Feature: Appointment Scheduling #1124

Open evereq opened 4 years ago

evereq commented 4 years ago

Features

We need the following features:

Overview

We want to allow contacts/leads/clients/customers/partners to schedule appointments via the Gauzy Platform with one or more Employees or Teams (can be mixed, but it’s important is that scheduling happens with some Employees or Teams, not Users!)

We should also integrate this feature with the “Days Off” feature where employees can select days when they are not available (in case, it should not be possible to book a meeting for such a date!)

Essentially, when Employee login to Gauzy on some page she/he should see calendar (or list) with appointments booked / free time and other “events” (not a part of appointments, but the feature which related).

Next, for each employee or team, there is a public page where it’s possible to book a meeting with her/him or with the whole team. It can be booked by another employee(s) or by someone who has a contact record already (e.g. Leads or Clients or Customers) or by someone who did not register in Gauzy (e.g. someone who just visited a public page and booked an appointment there).

Same way, it should be possible to create a separate public page (link) where other people can book an appointment with selected employees/teams (in this case, we are talking about some employees and/or teams who decided to accept bookings for meetings. For example, Employee A and Employee B may decide to make such a page to allow the prospect to talk with both of them.

We need also to think about how to integrate this feature with Time Tracking features, with Tasks feature etc

rmagon commented 4 years ago

@kamesh95 Organizations already have a public page like http://localhost:4200/#/share/organization/ever-technologies-ltd maybe we can use that itself or a child page in the same share module to show available meetings as well. like http://localhost:4200/#/share/organization/ever-technologies-ltd maybe/appointments.

Especially think of repeating weekly/monthly appointments because when setting their availability/work schedule Employees would usually like to enter something like "Ever Monday 9am to 5pm" or "Every Tuesday 10am to 4pm".

I would suggest you first understand the requirements nicely, check existing appointment scheduling tools & then think about how the implementation would work.

evereq commented 4 years ago

@kamesh95 yes, so of course in order to build this Epic features, you need to carefully research how it's done in similar software but also research related features in Gauzy itself.

The thing is: Gauzy is more integrated software compared to most of the appointment schedule software in the market. I.e. in Gauzy, such a feature should be well integrated with other features (calendars, days off, tasks, projects, clients, etc).

Let's consider existed software features: 1) it usually provides some public page, where it is possible to schedule meetings (appointment) with some person using a calendar of her/his availability with some timezone matching etc. 2) Next, if someone booked such a meeting (possibly also paid for it!), the host and participant will get an email reminder (which also adds the event to his calendar), etc.

In Gauzy, it's just one of the features we need, because all employees of some company get access to Gauzy, some company clients also get access, we have teams who can have own calendars, employees may indicate days off (holidays, we have that separate feature) and so on. I.e. it's more complex because not only we need a public page where prospects/clients can book employee(s) or team time, but also we need an "internal" system to book time between employees, share calendars/availability, etc.

So we can say that most of the software in the market which "dedicated" to schedule appointments has features that are "necessary" in Gauzy, but they are not "sufficient". We need more features that will allow employees to see other employees' availability and book a time if needed ("Transparency" feature of Gauzy).

But of course, we should start with some side of that and iteratively add more features to it. The public page which allows booking meeting for a specific employee(s) or organization is a great start and yes, we can use organization public page for such appointments requests like @rmagon suggested above.

kamesh95 commented 4 years ago

@rmagon @evereq Makes sense to me. So I will add a public page to shared module where we display scheduled appointments for Employees as well as Teams level with a tab for each of them. Also user can schedule meetings there, so we have internal appointments booking in http://localhost:4200/#/pages/employees/appointments while the public user bookings in the shared module. Also, I am indeed exploring out the existing tools out there and following the above feature list one by one to add in our appointment scheduling page.

rmagon commented 4 years ago

@kamesh95 That's great!

kamesh95 commented 4 years ago

@rmagon @evereq For the recurring appointments, I have a few thoughts:

  1. We will store the recurrence in this format, https://www.kanzaki.com/docs/ical/rrule.html
  2. When we schedule an appointment with recurrence config, we have several options: 2.1 Store the first instance and the recurrence config along with it. Now whenever a user wants to see schedule for a day, we take all the recurrence scheduled appointments and compute their dates and show the ones that fall on the day for which user is seeing the schedule. 2.2 Keep a hover or something on the appointment itself with previous and next buttons that will take the user to the prev/next instance of the appointment. 2.3 Store all the future appointment instances at once when we are creating the appointment, though this sounds very bad, we will not need to calculate the appointments for a user dynamically. Any changes to original appointment will require changes to all stored instances.

If we go with 2.1 or 2.2, we can easily integrate days off feature as well to see if the next appointment date falls on a day when the employee is available. Also, do we need to allow the user to change the schedule for one of the events in future from his recurrence appointments? If yes, then we will have to store it as a normal appointment and skip that date in our recurrence appointment. Let me know your thoughts.

evereq commented 4 years ago

@rmagon what is your opinion, how we should store recurring appointments?

Meanwhile, you @kamesh95 can still continue working on the feature to get parameters from the user about such recurring appointments (e.g. frequency, hours, etc).

Also, I would say recurring appointments have a lower priority compared to making one time appointments completely working. Ideally, we want to have a pages for all employees where it's possible to book 1:1 appointments as soon as possible and add more functionality after that.

evereq commented 4 years ago

More relevant information:

  1. When a public user visits the employee appointment page http://localhost:4200/#/share/employee/evereq then the user is presented with predefined duration selectors of 15, 30, 60mins, and custom minutes/hours meeting duration or an all-day meeting. Note: this durations of 15, 30, and 60 min are configurable “Types” of Event.

Users can create other types, e.g. “3 hours” or “Install VS Code on your PC” event types with some custom description but specific length (in minutes, hours, or even days I think). Later we will need to support multiple employees who share the same booking page (e.g. http://localhost:4200/#/share/employees/GUID (replace GUID with randomly generated UUID) or teams page http://localhost:4200/#/share/team/backend-team or even organization page http://localhost:4200/#/share/organization/myorg etc.

  1. Next, the user is presented with a calendar where they can select free slots from the employee availability dates. For this, we will need the time of data, holidays, existing appointments, and employee daily availability time to show or block slots accordingly.

  2. After selecting the time slot, the user is presented with a form consisting of fields: Name, Email, Meeting agenda and link, Emails of attendees, Additional details or description, Buffer and break time for meetings. The buffer and break times are included in the appointment timings selected.

  3. After the form submission, the user is presented with the option of sending an email invite with event details to all the attendees including the employee with whom the meeting is booked.

  4. We need to be able to have a menu where the employees can mark their availability for the meetings so that the same schedules are presented to a public user at the time of bookings.

  5. Once the appointment is finalized, the employees should be able to see their bookings somewhere in gauzy. Is this part of a separate story or do we need this to be developed as a part of appointment scheduling only? It should be a calendar in the appointment scheduling (so it is a feature of this Epic), but also it should be later displayed in the “Schedule” page under Employees and even in the global organization (or team) calendars, etc.

  6. The end-user who is booking meetings, does he/she be presented with a list of his/her booking events? If yes, then the end-user will have to be signed up with gauzy so that we can keep track of their bookings. Or we can also generate a unique link after the appointment booking, this link will have to be kept with the user or we can also email this link to the user. It will display details of the booking event. We can implement this at much later stages, for now it can be just some email/calendar info where it’s easy to “Cancel” event (e.g. have a link to cancel it).

Note: if it’s a registered employee who registers meeting with another employee, such a meeting should be displayed on his own appointment calendar too! I.e multiple employees of the same organization in Gauzy should be able to create 1:1 meetings with this feature and BOTH sides should see them in calendars etc.

  1. Do we need to consider a possibility where a user can modify the appointment or cancel it? If yes, we can present these options with the event details that the user is allowed to see via the 7th point.

Yes, we need, but mostly that needed for the case when both users are employees in some org in Gauzy. If one of them is an unknown person, in such case she/he can cancel the meeting using some Link and also probably we can build a public page which will allow such person to edit meeting (e.g. time) using a link with some secure token (such links can be sent to the user when he creates appointment)

kamesh95 commented 4 years ago

@evereq @rmagon I think almost all the points mentioned above have been covered now. What are the next steps?

evereq commented 4 years ago

@kamesh95 can you record some video that demo all that is done in this Epic so far (Loom)? So we analyze it and decide on the next steps?

kamesh95 commented 4 years ago

@evereq @rmagon This is the link of the video https://www.loom.com/share/1ad5ade0a26d44be93438459182f00e4

Some things that are yet to be covered:

  1. Appointment edit page
  2. If we are booking an internal meeting, when we select other employees in that appointment form we need to take care of their availability slots as well. So that we don't overlap a meeting or only book it if the employee is available during that time. But when we book an internal appointment, the availability slots on the calendar will be of the employee with whom we are booking right? So if we have the option to select other employees in the appt form, it needs to show only those users that are available during that slot. Any inputs will be valuable here as this seems a bit confusing.
evereq commented 4 years ago

@kamesh95 ok, so can you work for now on 1 (Appointment edit page).

For 2, I think when we book a meeting for current employees when we add other employees in the form, we should verify if other employees are available and if they are not, we should display some kind of message/notification about that or something like that. Alternative (a bit more complex), would be to also display information about each employee in terms of his available time in the same date as this:

We will create more tasks related to this Epic soon

evereq commented 4 years ago

@kamesh95 I reviewed current functionality, it's all great, but we need more improvements to be done. Please first read again this ticket description https://github.com/ever-co/gauzy/issues/1124#issue-610891917 and overview section and I suggest reading again ALL comments because it feels like we missing multiple features which you can start building if you will re-read all that info.

Here is a list of things I notice (after testing and reading again all info above):

  1. Did we integrate an appointment schedule with the Time Off feature? E.g. if some employee requested time off, such time should be marked automatically as "Not available" in the Schedule and such interval should NOT be available for appointment scheduling

  2. How to get to the "Shared" (public) page where it's possible to book an appointment for a given Employee? I don't think we have anywhere in UI any button which will redirect to such a page? Think on the Appointments page http://localhost:4200/pages/employees/appointments, we can add to the right in the row where we have now titled "Appointments" button called "Appointment Booking Page" and if I click on such button, we redirect to "Book an Appointment" page (with URL like /share/employee/guid, I saw it in the video in)

  3. We need to improve the page called "Book an Appointment" so that if no GUID given in the URL, we allow selecting Employee for whom it will be possible to book an appointment from the list of available Employees (basically instead of display Employee name/image, we should display selector). Why we need that? Because in 2 above, we want to support the user to click the "Appointment Booking Page" button, even if NO employee selected in the site header ("All Employees" selected). So in such a case, we don't know for whom a user wants to create an appointment and we need to explicitly ask. The same will be useful also if we share such an Appointment booking page with our clients and we want to allow the client to select which employee he wants to book an appointment with (e.g. client want to review our employees and select the best fit). In such a case, we again will share a common page where it should be possible to select Employee and book appointments with her/him.

  4. We should add the ability to create Embed to put appointment booking Widget into any website

  5. We should support customizations of the appointment booking page (theme, colors, logo, any many more things)

  6. One of the most important features of appointment booking page is support for multiple timezones (we should auto-detect timezone of end-user, but still allow her/him to select manually timezone)

  7. We should add new Email Types which should send notifications/calendar events to both sides (i.e who booked appointment and employees)

  8. What about the Team Appointments page? We need to have a page where the whole Team can see appointments scheduled with them etc

  9. We need to add Paid appointments feature (let's not integrate payment gateway, it's a separate story with payments, but we need to be able to set price for appointment, currency, etc).

I would say priority of this is: 2, 3, 6, 7, 1, 4, 5, 8, 9.

I probably missed LOTs of things which we still need to be done, but it feels like above is already a good start for you :) We did a LOT of features in this Epic, however honestly, it feels like we just started ;)

kamesh95 commented 4 years ago

@evereq With point 7 Email Types, can you elaborate a bit more? Like Event types, I should create a new module Email types? And after appointment booking, user can select the email type or something to send alert for appointment?

evereq commented 4 years ago

@kamesh95 see https://github.com/ever-co/gauzy/issues/1688, it describes a bit about Email Templates, etc. However, I think let's leave that 7) for the end as we have now another dev who should take care of different email templates, could be he can also handle yours :) So focus on all other tasks for now if you can.