Exemplo n.º 1
0
        /// <summary>
        ///     Splits the avaiable date from overlapping reservations.
        /// </summary>
        /// <param name = "avail">The avail.</param>
        /// <param name = "overlappingDates">The overlapping dates.</param>
        /// <returns></returns>
        private static IEnumerable<AppointmentObj> SplitAvaiableDateFromOverlappingReservations(
            AppointmentObj avail, IEnumerable<AppointmentObj> overlappingDates)
        {
            var aList = new List<AppointmentObj>();
            //Stores current date placeholder
            DateTime? currentStart = null;
            //Stores how many hours are valid
            var currentHours = 1;
            //Iterates over times incrementing by 1 hour checking for overlap
            for (var date = avail.Start; date.Date < avail.End; date = date.AddHours(1))
            {
                //if date is >= the end date then break;
                if (date >= avail.End)
                    break;

                var dateForQuery = date;
                //Check current hour range 12-13 and detect any overlaps with reserved dates
                if (overlappingDates.Any(t => AppointmentObj.OverlapsWith(t,
                    new AppointmentObj("Available", dateForQuery, dateForQuery.AddHours(1), "", "", "", avail.UserId, false, avail.DbId))))
                {
                    //Found Overlap
                    //Current date is set but now out of range
                    //Need to create appointment object);
                    if (currentStart != null)
                    {
                        aList.Add(new AppointmentObj("Available", ((DateTime) currentStart),
                            ((DateTime) currentStart).AddHours(currentHours), "", "", "", avail.UserId, false, avail.DbId));
                        currentStart = null; //Reset
                        currentHours = 1; //Reset
                    }
                }
                else
                {
                    if (currentStart == null)
                        //New valid date range found
                        currentStart = date;
                    else
                        //Still current date range extend
                        currentHours++;
                }
            }
            //Finished looping valid date still stored
            if (currentStart != null)
            {
                aList.Add(new AppointmentObj("Available", ((DateTime) currentStart),
                    ((DateTime) currentStart).AddHours(currentHours), "", "", "", avail.UserId, false, avail.DbId));
            }
            return aList;
        }
Exemplo n.º 2
0
 /// <summary>
 ///     Processes the availability date over lap.
 /// </summary>
 /// <param name = "reservationList">The reservation list.</param>
 /// <param name = "availabilityList">The availability list.</param>
 /// <returns></returns>
 private static IEnumerable<AppointmentObj> ProcessAvailabilityDateOverLap(IEnumerable<AppointmentObj> reservationList, IEnumerable<AppointmentObj> availabilityList)
 {
     var apptList = new List<AppointmentObj>();
     foreach (var avail in availabilityList)
     {
         var avilForQuery = avail;
         //Check if current availability date overlaps with any reserved dates.
         var overLapList = (from d in reservationList where AppointmentObj.OverlapsWith(d, avilForQuery) select d).ToList();
         //If no overlap then simply add to list
         if (overLapList.Count == 0)
             apptList.Add(avail);
         else
         {
             //Overlap found handle breaking availability across reserved dates.
             var splitList = SplitAvaiableDateFromOverlappingReservations(avail, overLapList);
             apptList.AddRange(splitList);
         }
     }
     return apptList;
 }
Exemplo n.º 3
0
        /// <summary>
        /// Handles the Click event of the _btnAddDates control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        protected void _btnAddDates_Click(object sender, EventArgs e)
        {
            var date = (DateTime)_rdpDate.DbSelectedDate;

            var startTime = ((DateTime)_rtpStartTime.DbSelectedDate).TimeOfDay;
            var endTime   = ((DateTime)_rtpEndTime.DbSelectedDate).TimeOfDay;

            var appt = new AppointmentObj
            {
                Busy = true,

                Days  = String.Empty,
                End   = date.Add(endTime),
                Start = date.Add(startTime),
            };

            var isVald = GetIsValdAddDates(startTime, endTime);

            if (isVald == false)
            {
                return;
            }

            foreach (var d in ReservedAppt)
            {
                if ((d.ToAppointmentObj().Start == appt.Start && d.ToAppointmentObj().End == appt.End) || (d.ToAppointmentObj().Start.Date == date && !appt.AllowedToAdd(d.ToAppointmentObj())))
                {
                    WriteToBothFeedback(FeedbackType.Error, "Date conflicts with existing reserved date");
                    return;
                }
            }

            var db = new UrbanDataContext();
            var currentAvailabilityDates = RoomAvailabilityUtilities.GetAppointmentObjsWithRecurring(ref db, DateTime.MinValue, DateTime.MaxValue, RoomId).Where(t => t.Start.Date == date && t.End.Date == date).ToList();
            var validToAdd = false;

            foreach (var c in currentAvailabilityDates)
            {
                if (c.Busy == false && appt.AllowedToAdd(c))
                {
                    validToAdd = true;
                }
                else if (c.Busy == true && appt.OverlapsWith(c))
                {
                    validToAdd = false;
                    break;
                }
            }

            if (validToAdd)
            {
                WriteToBothFeedback(FeedbackType.Success, "Date Added");
                ReservedAppt.Add(new ReserveRoomTempObject {
                    Date = date, End = endTime, Start = startTime
                });
            }
            else
            {
                WriteFeedBackMaster(FeedbackType.Error, "Date is not valid or overlaps with another date");
            }


            _rgAvailableTimes.Rebind();
        }