public JsonResult ScheduleCustomer(ScheduleCustomerModel scheduleCustomerModel) { if (scheduleCustomerModel is null) { return(Json("Object cannot be null.")); } if (!c_listOfBarbers.Contains(scheduleCustomerModel.BarberName)) { return(Json("Barber must be one of the following: " + string.Join(", ", c_listOfBarbers))); } // get list of already scheduled customers from session. List <ScheduledCustomerModel> currentScheduledCustomers = scheduledCustomers; // Check to see we aren't scheduling the same customer twice. if (currentScheduledCustomers.Any(a => a.Name == scheduleCustomerModel.Name && a.PhoneNumber == scheduleCustomerModel.PhoneNumber)) { return(Json("Customer is already scheduled.")); } ScheduledCustomerModel newScheduledCustomerModel = new ScheduledCustomerModel { AppointmentID = GetAppointmentId(), Name = scheduleCustomerModel.Name, PhoneNumber = scheduleCustomerModel.PhoneNumber, BarberNameRequested = scheduleCustomerModel.BarberName }; bool barberWasAvailable = false; // If the barber requested is not busy, assign them to that barber. if (!currentScheduledCustomers.Any(a => a.CurrentBarberAssigned == scheduleCustomerModel.BarberName)) { barberWasAvailable = true; newScheduledCustomerModel.CurrentBarberAssigned = scheduleCustomerModel.BarberName; } currentScheduledCustomers.Add(newScheduledCustomerModel); // update the session data. scheduledCustomers = currentScheduledCustomers; if (barberWasAvailable) { return(Json("Success. Customer is seeing barber.")); } else { // exclude the customers who are already currently assigned a barber. return(Json(String.Format("Success. Customer is {0} in line.", currentScheduledCustomers.Where(w => w.CurrentBarberAssigned is null).Count()))); } }
public JsonResult SetCustomerInBarberChair(int appointmentId, string barberNameRequested, BarberScheduleType barberScheduleType) { List <ScheduledCustomerModel> currentScheduledCustomers = scheduledCustomers; // Identify the customer sitting in the chair with this AppointmentID. ScheduledCustomerModel customerInRow = currentScheduledCustomers.SingleOrDefault(a => a.AppointmentID == appointmentId); // identify the barber that has the lowest wait time. List <Tuple <string, decimal> > barbersAndWaitTimes = GetBarberNamesAndWaitTimes(); if (barberScheduleType == BarberScheduleType.InChair) { // Find the customer we need to remove assigned to this barber. ScheduledCustomerModel customerToRemove = currentScheduledCustomers.Where(w => w.CurrentBarberAssigned == barberNameRequested).FirstOrDefault(); if (customerToRemove != null) { currentScheduledCustomers.Remove(customerToRemove); } // Update the AppointmentID passed in to be assigned the barber desired. foreach (ScheduledCustomerModel cust in currentScheduledCustomers) { if (cust.AppointmentID == customerInRow.AppointmentID) { cust.CurrentBarberAssigned = customerInRow.BarberNameRequested; } } } else if (barberScheduleType == BarberScheduleType.NextAvailableBarber) { // It's possible their preferred barber is the one with lowest wait time. // In this situation, lets favor their desired barber. decimal minWaitTime = barbersAndWaitTimes.Select(s => s.Item2).Min(); // find barbers with the min wait time. List <string> barbersWithMinWaitTime = barbersAndWaitTimes .Where(w => w.Item2 == minWaitTime) .Select(s => s.Item1) .ToList(); // if none of the barbers with lowest wait times are the preferred barber, use another barber. if (!barbersWithMinWaitTime.Any(a => a == barberNameRequested)) { barberNameRequested = barbersWithMinWaitTime.First(); } // Find the customer we need to remove assigned to this barber. ScheduledCustomerModel customerToRemove = currentScheduledCustomers.Where(w => w.CurrentBarberAssigned == barberNameRequested).FirstOrDefault(); if (customerToRemove != null) { currentScheduledCustomers.Remove(customerToRemove); } // Update the Customer passed in to now be assigned to the barber they requested. foreach (ScheduledCustomerModel cust in currentScheduledCustomers) { if (cust.AppointmentID == appointmentId) { cust.CurrentBarberAssigned = barberNameRequested; } } } else if (barberScheduleType == BarberScheduleType.MarkDone) { string barberNameNowUnassigned = customerInRow.CurrentBarberAssigned; // Remove the customer in row, because we've marked them as done. if (customerInRow != null) { currentScheduledCustomers.Remove(customerInRow); } // find the Customer that is next in line to sit in this barber's chair. ScheduledCustomerModel nextCustomerToBeAssigned = currentScheduledCustomers .Where(w => w.BarberNameRequested == barberNameNowUnassigned) .OrderBy(o => o.AppointmentID) // Find the customer that has been waiting the longest. .FirstOrDefault(); if (nextCustomerToBeAssigned != null) { foreach (ScheduledCustomerModel cust in currentScheduledCustomers) { if (cust.AppointmentID == nextCustomerToBeAssigned.AppointmentID) { cust.CurrentBarberAssigned = nextCustomerToBeAssigned.BarberNameRequested; // careful here, the barberNameRequested here is not what we want to assign. } } } } // update the Session data. scheduledCustomers = currentScheduledCustomers; return(Json("Success")); }
public JsonResult ScheduleCustomer(ScheduleCustomerModel scheduleCustomerModel) { if (scheduleCustomerModel is null) { return(Json("Error: Object cannot be null.")); } if (!c_listOfBarbers.Contains(scheduleCustomerModel.BarberName)) { return(Json("Error: Barber must be one of the following: " + string.Join(", ", c_listOfBarbers))); } if (string.IsNullOrWhiteSpace(scheduleCustomerModel.Name)) { return(Json("Error: Must provide a customer name.")); } if (string.IsNullOrWhiteSpace(scheduleCustomerModel.PhoneNumber)) { return(Json("Error: Must provide a phone number.")); } // get list of already scheduled customers from session. List <ScheduledCustomerModel> currentScheduledCustomers = scheduledCustomers; // Check to see we aren't scheduling the same customer twice. if (currentScheduledCustomers.Any(a => a.Name.ToLower() == scheduleCustomerModel.Name.ToLower() && a.PhoneNumber == scheduleCustomerModel.PhoneNumber)) { return(Json("Warning: Customer is already scheduled.")); } ScheduledCustomerModel newScheduledCustomerModel = new ScheduledCustomerModel { AppointmentID = GetAppointmentId(), Name = scheduleCustomerModel.Name, PhoneNumber = scheduleCustomerModel.PhoneNumber, BarberNameRequested = scheduleCustomerModel.BarberName }; bool barberWasAvailable = false; // If the barber requested is not busy, assign them to that barber. if (!currentScheduledCustomers.Any(a => a.CurrentBarberAssigned == scheduleCustomerModel.BarberName)) { barberWasAvailable = true; newScheduledCustomerModel.CurrentBarberAssigned = scheduleCustomerModel.BarberName; } currentScheduledCustomers.Add(newScheduledCustomerModel); // update the session data. scheduledCustomers = currentScheduledCustomers; if (barberWasAvailable) { return(Json("Success: Customer is seeing barber.")); } else { int positionInLine = currentScheduledCustomers.Where(w => w.CurrentBarberAssigned is null).Count(); string ordinalFormatting = OrdinalUtility.ToOrdinal(positionInLine); // exclude the customers who are already currently assigned a barber. return(Json(String.Format("Success: Customer is {0}{1} in line.", positionInLine, ordinalFormatting))); } }