예제 #1
0
    public StartEndTime GetStartEndTime(DateTime startDate, DateTime endDate)
    {
        TimeSpan startTime = new TimeSpan(12, 0, 0);
        TimeSpan endTime   = new TimeSpan(12, 10, 0);

        DateTime curDate = startDate;

        for (int i = 0; i < 7; i++)
        {
            curDate = curDate.AddDays(1);
            if (curDate > endDate)
            {
                break;
            }

            StartEndTime startendTime = this.GetStartEndTime(curDate.DayOfWeek);
            if (startendTime.StartTime != StartEndTime.NullTimeSpan && startendTime.StartTime < startTime)
            {
                startTime = startendTime.StartTime;
            }
            if (startendTime.EndTime != StartEndTime.NullTimeSpan && startendTime.EndTime > endTime)
            {
                endTime = startendTime.EndTime;
            }
        }
        return(new StartEndTime(startTime, endTime));
    }
예제 #2
0
        public override INullableQuerySerie <T> ExecuteGrouping()
        {
            var rows = Serie.Rows;

            if (!rows.Any() || !GroupTimes.Any())
            {
                return(new NullableQuerySerie <T>(new List <ISingleDataRow <T?> >(), Serie));
            }

            int index = 0;
            var max   = rows.Count;

            var result             = new List <ISingleDataRow <T?> >();
            int?nextTimeRangeIndex = null;

            for (int groupIndex = 0; groupIndex < GroupTimes.Count; groupIndex++)
            {
                StartEndTime groupTime     = GroupTimes[groupIndex];
                StartEndTime nextGroupTime = (groupIndex + 1 < GroupTimes.Count) ? GroupTimes[groupIndex + 1] : null;
                var          group         = new List <ISingleDataRow <T> >();
                while (index < max && rows[index].TimeUtc < groupTime.Start)
                {
                    index++;
                }
                var startIndex = index;

                while (index < max && rows[index].TimeUtc < groupTime.End)
                {
                    group.Add(rows[index]);
                    if (nextTimeRangeIndex == null && nextGroupTime != null && rows[index].TimeUtc > nextGroupTime.Start)
                    {
                        nextTimeRangeIndex = Math.Max(index - 1, 0);
                    }

                    index++;
                }
                var aggregationData = new QuerySerie <T>(@group, groupTime.Start, groupTime.End)
                {
                    PreviousRow = startIndex > 0 ? rows[startIndex - 1] : Serie.PreviousRow,
                    NextRow     = index < max ? rows[index] : Serie.NextRow
                };
                result.Add(new SingleDataRow <T?>(groupTime.GetTimeStampByType(TimeStampType),
                                                  AggregationFunc(aggregationData)));
                if (nextTimeRangeIndex != null)
                {
                    index = nextTimeRangeIndex.Value;
                    nextTimeRangeIndex = null;
                }
            }

            var resultData = new NullableQuerySerie <T>(result, Serie);

            return(resultData);
        }
예제 #3
0
        public void GroupByGroupTimesStartWithPrevAndNext()
        {
            var          serie     = PrepareForGroupTests();
            var          startTime = new DateTime(1000, 1, 1, 0, 2, 0, DateTimeKind.Utc);
            StartEndTime groupTime = new StartEndTime(startTime, new DateTime(1000, 1, 1, 0, 9, 0, DateTimeKind.Utc));

            ;

            var result = serie.Group(g => g.ByTimeRanges(new[] { groupTime }).Aggregate(i => i.MeanByTime()));

            result.Rows.Count.Should().Be(1);
            result.Rows[0].TimeUtc.Should().Be(startTime);
            result.Rows[0].Value.Should().BeApproximately(4.285f, 3);
        }
예제 #4
0
        public void GroupByGroupTimesStartBeforeStartOfSerie()
        {
            var          serie     = PrepareForGroupTests();
            var          startTime = new DateTime(1000, 1, 1, 0, 0, 0, DateTimeKind.Utc) - TimeSpan.FromMinutes(1);
            StartEndTime groupTime = new StartEndTime(startTime, new DateTime(1000, 1, 1, 0, 10, 0, DateTimeKind.Utc));

            ;

            var result = serie.Group(g => g.ByTimeRanges(new[] { groupTime }).Aggregate(i => i.MeanByTime()));

            result.Rows.Count.Should().Be(1);
            result.Rows[0].TimeUtc.Should().Be(startTime);
            result.Rows[0].Value.Should().BeLessThan(4.2f);
        }
예제 #5
0
        protected OpeningTimes GetDayOpeningTimes(string day, string str)
        {
            var openingTimes = new OpeningTimes(day);

            if (string.IsNullOrEmpty(str))
            {
                return(openingTimes);
            }

            try
            {
                var hours             = new List <StartEndTime>();
                var openingHoursArray = JsonConvert.DeserializeObject <JArray>(str);//.FirstOrDefault();

                foreach (var openingHoursVal in openingHoursArray)
                {
                    var title     = openingHoursVal.Value <string>("title");
                    var startTime = openingHoursVal.Value <DateTime?>("startTime");
                    var endTime   = openingHoursVal.Value <DateTime?>("endTime");

                    if (startTime != null || endTime != null)
                    {
                        var startEndTime = new StartEndTime {
                            Title = title
                        };

                        if (startTime != null)
                        {
                            startEndTime.StartTime = ((DateTime)startTime).ToString("HH:mm:ss");
                        }

                        if (endTime != null)
                        {
                            startEndTime.EndTime = ((DateTime)endTime).ToString("HH:mm:ss");
                        }

                        hours.Add(startEndTime);
                    }
                }

                openingTimes.Hours = hours;
            }
            catch (Exception)
            {
                return(openingTimes);
            }

            return(openingTimes);
        }
예제 #6
0
        public void GroupByGroupTimes1()
        {
            var          serie     = PrepareForGroupTests();
            StartEndTime groupTime = new StartEndTime(new DateTime(1000, 1, 1, 0, 0, 0, DateTimeKind.Utc),
                                                      new DateTime(1000, 1, 1, 0, 10, 0, DateTimeKind.Utc));

            ;

            //var result = serie.GroupBy(new[] { groupTime }, i => i.MeanByTime());
            var result = serie.Group(g => g.ByTimeRanges(new[] { groupTime }).Aggregate(i => i.MeanByTime()));

            result.Rows.Count.Should().Be(1);
            result.Rows[0].TimeUtc.Should().Be(new DateTime(1000, 1, 1, 0, 0, 0));
            result.Rows[0].Value.Should().Be(4.2f);
        }
예제 #7
0
    public static StartEndTime GetStartEndTime(DateTime startDate, DateTime endDate, Organisation[] orgs)
    {
        TimeSpan startTime = new TimeSpan(12, 0, 0);
        TimeSpan endTime   = new TimeSpan(12, 10, 0);

        for (int i = 0; i < orgs.Length; i++)
        {
            StartEndTime startEndTime = orgs[i].GetStartEndTime(startDate, endDate);
            if (startEndTime.StartTime < startTime)
            {
                startTime = startEndTime.StartTime;
            }
            if (startEndTime.EndTime > endTime)
            {
                endTime = startEndTime.EndTime;
            }
        }
        return(new StartEndTime(startTime, endTime));
    }
예제 #8
0
        public static IReadOnlyList <StartEndTime> CombineByTolerance(this IReadOnlyList <StartEndTime> groups,
                                                                      TimeSpan tolerance)
        {
            var newGroups = new List <StartEndTime>(groups.Count);
            var previous  = groups.First();

            for (var i = 1; i < groups.Count; i++)
            {
                var current = groups[i];
                if ((current.Start - previous.End) <= tolerance)
                {
                    previous = new StartEndTime(previous.Start, current.End > previous.End ? current.End : previous.End);
                }
                else
                {
                    newGroups.Add(previous);
                    previous = current;
                }
            }
            newGroups.Add(previous);

            return(newGroups);
        }
예제 #9
0
    protected void AddBody(string bgColor = null)
    {
        if (this.daysData.Length == 0)
        {
            HideTableAndSetErrorMessage("No days selected to display");
            return;
        }
        if (this.NumColumns == 0)
        {
            HideTableAndSetErrorMessage("No providers allocated for selected days and organisation/s");
            return;
        }

        UserView userView = UserView.GetInstance();
        int loggedInStaffID = Session["StaffID"] == null ? -1 : Convert.ToInt32(Session["StaffID"]);

        StartEndTime startEndTime = GetStartEndTimes();
        bookingModalElementControl.SetModalDropDownList(startEndTime);

        int minsPerRow = bookingSlotMinsCache.GetSlotMins();
        bool serviceAndPatientSet = ddlServices.SelectedValue != "-1" && txtPatientID.Text.Length > 0;

        int slotMins = bookingSlotMinsCache.GetSlotMins();
        int nRows = (int)startEndTime.EndTime.Subtract(startEndTime.StartTime).TotalMinutes / slotMins;
        for (int r = 0; r < nRows; r++)
        {
            HtmlTableRow htr = new HtmlTableRow();
            main_table.Controls.Add(htr);
            if (bgColor != null)
                htr.BgColor = bgColor;

            int totalDaysShowing = 0;
            for (int i = 0; i < this.daysData.Length; i++)
                if (this.daysData[i].NCols > 0)
                    totalDaysShowing++;

            int rowMinHeight = -1; // 43;
            int timeCol = 109;
            int scrollBarWidth = (int)main_panel.Width.Value - Convert.ToInt32(header_table.Style["width"].Substring(0, header_table.Style["width"].Length - 2));

            TimeSpan rowTime = startEndTime.StartTime.Add(new TimeSpan(0, r * slotMins, 0));

            bool addedTimeCol = false;
            for (int i = 0; i < this.daysData.Length; i++)
            {
                // dont display anything for days with no cols
                if (this.daysData[i].NCols == 0)
                    continue;

                htr.VAlign = "top";
                htr.Align = "left";

                //if (i == 0 || mutlipleTimesShowing)
                if (!addedTimeCol || mutlipleTimesShowing)
                {
                    // add day seperator
                    //if (i != 0)
                    //    main_table.Rows[r].Controls.Add(NewBlankCell(false, this.DaySeperatorColumnWidth, false, System.Drawing.Color.DarkGray));

                    HtmlTableCell timeCell = NewCell(null, false, GetRowTime(startEndTime.StartTime, r, slotMins), System.Drawing.Color.Empty, timeCol, rowMinHeight, "center");
                    timeCell.Attributes.Add("class", BookingSlot.GetContextMenuClass(BookingSlot.Type.None));
                    main_table.Rows[r].Controls.Add(timeCell);
                    addedTimeCol = true;
                }

                //main_table.Rows[r].Controls.Add(NewBlankCell(false, this.DaySeperatorColumnWidth, false, System.Drawing.Color.DarkGray));

                DayData curDayData = this.daysData[i];
                DateTime curDate = curDayData.Date;
                bool seenFirst = false;
                for (int j = 0; j < curDayData.OrgDayData.Length; j++)
                {

                    // dont display anything for orgs with no cols
                    if (this.daysData[i].OrgDayData[j].NCols == 0)
                        continue;

                    // add org seperator
                    //if (j != 0 && seenFirst)
                    //    main_table.Rows[r].Controls.Add(NewBlankCell(false, this.DaySeperatorColumnWidth, false, System.Drawing.Color.DarkGray));

                    seenFirst = true;

                    OrgDayData curOrgDayData = curDayData.OrgDayData[j];
                    Organisation curDayOrg = curOrgDayData.Org;
                    for (int k = 0; k < curOrgDayData.StaffList.Length; k++)
                    {
                        Staff curDayStaff = curOrgDayData.StaffList[k];

                        // if there are no staff working ... still show a column with rows they can't right click to open a menu
                        if (curDayStaff == null)
                        {
                            string blankCellID = curDayOrg.OrganisationID + "_" + "0" + "_" + curDate.Date.ToString("yyyy_MM_dd") + "_" + rowTime.Hours.ToString().PadLeft(2, '0') + rowTime.Minutes.ToString().PadLeft(2, '0');
                            HtmlTableCell blankCell = NewCell("td_" + blankCellID, false, "", System.Drawing.Color.Empty, r == 0 ? this.columnWidth : -1, -1);
                            blankCell.Attributes.Add("class", BookingSlot.GetContextMenuClass(BookingSlot.Type.None));
                            System.Drawing.Color c = (IsEditBookingMode() || IsEditDayMode()) ? HSLColor.ChangeBrightness(BookingSlot.GetColor(BookingSlot.Type.Unavailable), -10) : BookingSlot.GetColor(BookingSlot.Type.Unavailable);
                            blankCell.BgColor = System.Drawing.ColorTranslator.ToHtml(Utilities.IsDev() ? HSLColor.ChangeBrightness(c, 40) : c);
                            main_table.Rows[r].Controls.Add(blankCell);
                            continue;
                        }

                        bool isProviderViewButOtherProvider = userView.IsProviderView && curDayStaff.StaffID != loggedInStaffID;

                        BookingSlot.Type slotType = (startEndTime == StartEndTime.NullStartEndTime || rowTime < startEndTime.StartTime || rowTime >= startEndTime.EndTime) ? (userView.IsPatient ? BookingSlot.Type.Unavailable : BookingSlot.Type.UnavailableButAddable) : (userView.IsPatient ? BookingSlot.Type.Available_PatientLoggedIn : BookingSlot.Type.Available);

                        //if (Request.QueryString["blah"] != null)
                        //    Logger.LogQuery("A1:" + (startEndTime == StartEndTime.NullStartEndTime));
                        //if (Request.QueryString["blah"] != null)
                        //    Logger.LogQuery("A2:" + (rowTime < startEndTime.StartTime));
                        //if (Request.QueryString["blah"] != null)
                        //    Logger.LogQuery("A3:" + (rowTime >= startEndTime.EndTime));
                        //if (Request.QueryString["blah"] != null)
                        //    Logger.LogQuery("B:" + slotType.ToString());

                        StartEndTime thisOrgStartEndTime = curDayOrg.GetStartEndTime(curDate.DayOfWeek);
                        StartEndTime thisOrgLunchStartEndTime = curDayOrg.GetStartEndLunchTime(curDate.DayOfWeek);
                        StartEndTime slotStartEndTime = new StartEndTime(rowTime, rowTime.Add(new TimeSpan(0, this.bookingSlotMinsCache.GetSlotMins(), 0)));
                        if ((thisOrgStartEndTime.StartTime != TimeSpan.Zero || thisOrgStartEndTime.EndTime != TimeSpan.Zero) && (thisOrgStartEndTime.StartTime > slotStartEndTime.StartTime || thisOrgStartEndTime.EndTime < slotStartEndTime.EndTime))
                        {
                            slotType = userView.IsPatient ? BookingSlot.Type.Unavailable : BookingSlot.Type.UnavailableButAddable;
                            //if (Request.QueryString["blah"] != null)
                            //    Logger.LogQuery("C");
                        }
                        if (thisOrgLunchStartEndTime.EndTime > thisOrgLunchStartEndTime.StartTime && (slotStartEndTime.StartTime < thisOrgLunchStartEndTime.EndTime && slotStartEndTime.EndTime > thisOrgLunchStartEndTime.StartTime))
                        {
                            slotType = userView.IsPatient ? BookingSlot.Type.Unavailable : BookingSlot.Type.UnavailableButAddable;
                            //if (Request.QueryString["blah"] != null)
                            //    Logger.LogQuery("D");
                        }
                        //if (Request.QueryString["blah"] != null)
                        //    Logger.LogQuery("E:" + slotType.ToString());

                        if (IsEditBookingMode() && (slotType == BookingSlot.Type.Available || slotType == BookingSlot.Type.Available_PatientLoggedIn))
                            slotType = BookingSlot.Type.Updatable;
                        if (IsEditDayMode() && (slotType == BookingSlot.Type.Available || slotType == BookingSlot.Type.Available_PatientLoggedIn))
                            slotType = BookingSlot.Type.Updatable;  // use same color as editing bookings so screen colours are same when "moving" bookings, but remove context menu for full day move
                        if (IsEditBookingMode() && (slotType == BookingSlot.Type.UnavailableButAddable))
                            slotType = BookingSlot.Type.UnavailableButUpdatable;
                        if (IsEditDayMode() && slotType == BookingSlot.Type.UnavailableButAddable)
                            slotType = BookingSlot.Type.UnavailableButUpdatable;

                        //if (Request.QueryString["blah"] != null)
                        //    Logger.LogQuery("F:" + slotType.ToString());
                        string cellID = curDayOrg.OrganisationID + "_" + curDayStaff.StaffID + "_" + curDate.Date.ToString("yyyy_MM_dd") + "_" + rowTime.Hours.ToString().PadLeft(2, '0') + rowTime.Minutes.ToString().PadLeft(2, '0');
                        HtmlTableCell cell = NewCell("td_" + cellID, false, "", System.Drawing.Color.Empty, r == 0 ? this.columnWidth : -1, -1); // only set width for first row, so html has less text to send
                        Label newLbl = NewLbl(-1, 31, slotType, "lbl_" + cellID);

                        if (!IsEditDayMode() && !IsEditBookingMode())
                            cell.Attributes["ondblclick"]  = "dblclick(this.id); return false;";
                        //cell.Attributes["onmousedown"] = "bk_mouse_down(this.id); return false;";
                        //cell.Attributes["onmouseup"]   = "bk_mouse_up(this.id); return false;";
                        cell.BgColor = System.Drawing.ColorTranslator.ToHtml(Utilities.IsDev() ? HSLColor.ChangeBrightness(newLbl.BackColor, 40) : newLbl.BackColor);

                        if (rowTime == new TimeSpan(8, 30, 0))
                        {
                            string st = curDayStaff.Person.FullnameWithoutMiddlename;
                            ;
                        }

                        if (IsEditDayMode())
                            cell.Attributes.Add("class", BookingSlot.GetContextMenuClass(BookingSlot.Type.None));
                        //else if (!userView.IsStakeholder && !isMasterAdmin && !isAdmin && !isPrincipal && loggedInStaffID != curDayStaff.StaffID)  // if not admin, only show slot menu for logged in provider
                        //{
                        //    ((HtmlTableCell)cell).Attributes.Remove("class");
                        //    ((HtmlTableCell)cell).Attributes["class"] = BookingSlot.GetContextMenuClass(BookingSlot.Type.None);
                        //}
                        else // if (serviceAndPatientSet)
                        {
                            //if (isProviderViewButOtherProvider)
                            //    cell.Attributes.Add("class", BookingSlot.GetContextMenuClass(BookingSlot.Type.None));
                            //else
                                cell.Attributes.Add("class", BookingSlot.GetContextMenuClass((!userView.IsPatient || slotType != BookingSlot.Type.Unavailable) ? slotType : BookingSlot.Type.None));
                        }
                        /*
                        else
                        {
                            BookingSlot.Type type = BookingSlot.Type.PatientAndServiceNotSet;
                            if (ddlServices.SelectedValue == "-1" && txtPatientID.Text.Length > 0)
                                type = BookingSlot.Type.ServiceNotSet;
                            if (ddlServices.SelectedValue != "-1" && txtPatientID.Text.Length == 0)
                                type = BookingSlot.Type.PatientNotSet;

                            cell.Attributes.Remove("class");
                            cell.Attributes.Add("class", BookingSlot.GetContextMenuClass(type));
                        }
                        */

                        main_table.Rows[r].Controls.Add(cell);
                        cell.Controls.Add(newLbl);
                    }

                }

            }

        }
    }
예제 #10
0
    protected StartEndTime GetStartEndTimes()
    {
        bool containsPodiatry = false;
        bool containsAgedCare = false;
        foreach (Organisation o in this.orgs)
        {
            if (o.OrganisationType.OrganisationTypeID == 218)
                containsPodiatry = true;
            else
                containsAgedCare = true;
        }

        Site[] sites = SiteDB.GetAll();
        Hashtable siteHash = new Hashtable();
        foreach (Site s in sites)
        {
            siteHash[(s.SiteType.ID == 1)] = s;
        }

        if (!containsPodiatry && containsAgedCare)
        {
            //return new StartEndTime(((Site)siteHash[1]).DayStartTime, ((Site)siteHash[1]).DayEndTime);
            return new StartEndTime(((Site)siteHash[false]).DayStartTime, ((Site)siteHash[false]).DayEndTime);
        }
        else if (containsPodiatry && !containsAgedCare)
        {
            //return new StartEndTime(((Site)siteHash[2]).DayStartTime, ((Site)siteHash[2]).DayEndTime);
            return new StartEndTime(((Site)siteHash[true]).DayStartTime, ((Site)siteHash[true]).DayEndTime);
        }
        else if (containsPodiatry && containsAgedCare)
        {
            TimeSpan startTime = new TimeSpan(12, 0, 0);
            TimeSpan endTime = new TimeSpan(12, 10, 0);

            for (int i = 0; i < sites.Length; i++)
            {
                StartEndTime startEndTime = new StartEndTime(sites[i].DayStartTime, sites[i].DayEndTime);
                if (startEndTime.StartTime < startTime)
                    startTime = startEndTime.StartTime;
                if (startEndTime.EndTime > endTime)
                    endTime = startEndTime.EndTime;
            }
            return new StartEndTime(startTime, endTime);
        }
        else
            return new StartEndTime(new TimeSpan(8, 0, 0), new TimeSpan(20, 0, 0));
    }
    protected void CheckClashOneTimeBooking()
    {
        UserView userView = UserView.GetInstance();

        string org_id          = Request.QueryString["org"];
        string all_orgs        = Request.QueryString["all_orgs"];
        string staff_id        = Request.QueryString["staff"];
        string booking_id      = Request.QueryString["edit_booking_id"];
        string booking_type_id = Request.QueryString["booking_type_id"];

        string start_datetime = Request.QueryString["start_datetime"];
        string end_datetime   = Request.QueryString["end_datetime"];


        if (start_datetime == null || !Regex.IsMatch(start_datetime, @"^\d{4}_\d{2}_\d{2}_\d{4}$") ||
            end_datetime == null || !Regex.IsMatch(end_datetime, @"^\d{4}_\d{2}_\d{2}_\d{4}$") ||
            org_id == null || !Regex.IsMatch(org_id, @"^\-?\d+$") ||
            staff_id == null || !Regex.IsMatch(staff_id, @"^\-?\d+$") ||
            booking_id == null || !Regex.IsMatch(booking_id, @"^\-?\d+$"))
        {
            throw new CustomMessageException();
        }

        Organisation org     = OrganisationDB.GetByID(Convert.ToInt32(org_id));
        Staff        staff   = StaffDB.GetByID(Convert.ToInt32(staff_id));
        Booking      booking = booking_id == "-1" ? null : BookingDB.GetByID(Convert.ToInt32(booking_id));

        if (booking != null && booking_type_id == "-1")
        {
            booking_type_id = booking.BookingTypeID.ToString();
        }

        if ((org_id != "0" && org == null) ||
            (staff_id != "-1" && staff == null) ||
            (booking_id != "-1" && booking == null) ||
            (booking_type_id == null || (booking_type_id != "34" && booking_type_id != "340" && booking_type_id != "341" && booking_type_id != "342")))
        {
            throw new CustomMessageException();
        }

        DateTime startDateTime = ConvertStringToDateTime(start_datetime);
        DateTime endDateTime   = ConvertStringToDateTime(end_datetime);

        // if pt logged in, disallow booking over unavailabilities, otherwise allow it and ignore the check
        bool checkUnavailableDays = userView.IsPatient;

        Booking[] bookings = (all_orgs != null && all_orgs == "1") ?
                             BookingDB.GetToCheckOverlap_OneTime(startDateTime, endDateTime, staff, null, booking_type_id == "342", true, checkUnavailableDays) :
                             BookingDB.GetToCheckOverlap_OneTime(startDateTime, endDateTime, staff, org, booking_type_id == "342", true, checkUnavailableDays);

        if (bookings.Length > 0)
        {
            System.Collections.ArrayList list = new System.Collections.ArrayList();
            for (int i = 0; i < bookings.Length; i++)
            {
                if ((bookings[i].Organisation == null || (org != null && bookings[i].Organisation.OrganisationID == org.OrganisationID)) &&
                    (bookings[i].Provider == null || bookings[i].Provider.StaffID == staff.StaffID))
                {
                    list.Add(bookings[i]);
                }
            }
            bookings = (Booking[])list.ToArray(typeof(Booking));
        }

        // for patient, disallow booking over start/end times when clinic unavailable
        if (userView.IsPatient)
        {
            if (org == null)
            {
                org = booking.Organisation;
            }
            StartEndTime startEndTime      = org.GetStartEndTime(startDateTime.DayOfWeek);
            StartEndTime startEndLunchTime = org.GetStartEndLunchTime(startDateTime.DayOfWeek);
            if ((startEndTime.StartTime < startEndTime.EndTime && startDateTime.TimeOfDay < endDateTime.TimeOfDay && !(startDateTime.TimeOfDay >= startEndTime.StartTime && endDateTime.TimeOfDay <= startEndTime.EndTime)) ||
                (startEndLunchTime.StartTime < startEndLunchTime.EndTime && startDateTime.TimeOfDay < endDateTime.TimeOfDay && Booking.TimeIntersects(startEndLunchTime.StartTime, startEndLunchTime.EndTime, startDateTime.TimeOfDay, endDateTime.TimeOfDay)))
            {
                Response.Write("1");
                return;
            }
        }


        Response.Write(Booking.HasOverlap(bookings, startDateTime, endDateTime, booking) ? "1" : "0");
    }
    public void SetModalDropDownList(StartEndTime startEndTime)
    {
        int minBookingDurationMins = 10;

        if (Convert.ToBoolean(Session["SiteIsClinic"]))
        {
            minBookingDurationMins = Convert.ToInt32(((SystemVariables)Session["SystemVariables"])["BookingSheetTimeSlotMins_Clinic"].Value);
        }
        else if (Convert.ToBoolean(Session["SiteIsAgedCare"]))
        {
            minBookingDurationMins = Convert.ToInt32(((SystemVariables)Session["SystemVariables"])["BookingSheetTimeSlotMins_AgedCare"].Value);
        }
        else if (Convert.ToBoolean(Session["SiteIsGP"]))
        {
            minBookingDurationMins = Convert.ToInt32(((SystemVariables)Session["SystemVariables"])["BookingSheetTimeSlotMins_GP"].Value);
        }


        ddlModalStartHour.Items.Clear();
        ddlModalEndHour.Items.Clear();
        ddlModalStartMinute.Items.Clear();
        ddlModalEndMinute.Items.Clear();

        for (int i = startEndTime.StartTime.Hours; i <= startEndTime.EndTime.Hours; i++)
        {
            ddlModalStartHour.Items.Add(new ListItem(i.ToString().PadLeft(2, '0'), i.ToString().PadLeft(2, '0')));
            ddlModalEndHour.Items.Add(new ListItem(i.ToString().PadLeft(2, '0'), i.ToString().PadLeft(2, '0')));
        }
        for (int i = 0; i < 60; i += minBookingDurationMins)
        {
            ddlModalStartMinute.Items.Add(new ListItem(i.ToString().PadLeft(2, '0'), i.ToString().PadLeft(2, '0')));
            ddlModalEndMinute.Items.Add(new ListItem(i.ToString().PadLeft(2, '0'), i.ToString().PadLeft(2, '0')));
        }


        for (int i = 0; i <= 23; i++)
        {
            ddlModalPopupUnavailableRecurringModalStartHour.Items.Add(new ListItem(i.ToString().PadLeft(2, '0'), i.ToString().PadLeft(2, '0')));
            ddlModalPopupUnavailableRecurringModalEndHour.Items.Add(new ListItem(i.ToString().PadLeft(2, '0'), i.ToString().PadLeft(2, '0')));
        }
        for (int i = 0; i < 60; i += minBookingDurationMins)
        {
            ddlModalPopupUnavailableRecurringModalStartMinute.Items.Add(new ListItem(i.ToString().PadLeft(2, '0'), i.ToString().PadLeft(2, '0')));
            ddlModalPopupUnavailableRecurringModalEndMinute.Items.Add(new ListItem(i.ToString().PadLeft(2, '0'), i.ToString().PadLeft(2, '0')));
        }


        ddlOrgUnavailabilityReason.Items.Add(new ListItem("[None]", "-1"));
        DataTable tblUnavailabilityReasons = DBBase.GetGenericDataTable_WithWhereOrderClause(null, "BookingUnavailabilityReason", "", "descr", "booking_unavailability_reason_id", "booking_unavailability_reason_type_id", "descr");

        foreach (DataRow row in tblUnavailabilityReasons.Rows)
        {
            if (row["booking_unavailability_reason_type_id"].ToString() == "341")
            {
                ddlProvUnavailabilityReason.Items.Add(new ListItem(row["descr"].ToString(), row["booking_unavailability_reason_id"].ToString()));
            }
            else if (row["booking_unavailability_reason_type_id"].ToString() == "340")
            {
                ddlOrgUnavailabilityReason.Items.Add(new ListItem(row["descr"].ToString(), row["booking_unavailability_reason_id"].ToString()));
            }
        }


        //DataTable tblBookingChangeHistoryReasons = DBBase.GetGenericDataTable_WithWhereOrderClause("BookingChangeHistoryReason", "", "display_order, descr", "booking_change_history_reason_id", "descr", "display_order");
        DataTable tblBookingChangeHistoryReasons = BookingChangeHistoryReasonDB.GetDataTable();

        foreach (DataRow row in tblBookingChangeHistoryReasons.Rows)
        {
            ddlBookingMovementReason.Items.Add(new ListItem(row["descr"].ToString(), row["booking_change_history_reason_id"].ToString()));
        }

        ddlEveryNWeeks.Items.Clear();
        for (int i = 1; i <= 13; i++)
        {
            ddlEveryNWeeks.Items.Add(new ListItem(i.ToString(), i.ToString()));
        }

        ddlOcurrences.Items.Clear();
        for (int i = 1; i <= 13; i++)
        {
            ddlOcurrences.Items.Add(new ListItem(i.ToString(), i.ToString()));
        }

        ddlUnavailableEveryNWeeks.Items.Clear();
        for (int i = 1; i <= 13; i++)
        {
            ddlUnavailableEveryNWeeks.Items.Add(new ListItem(i.ToString(), i.ToString()));
        }
    }