public void SetGlobalVariables() { // get list of orgs int[] orgIDs = GetFormOrgs(); //this.orgs = new Organisation[orgIDs.Length]; // EDIT: changed to show all offerings to all clinics (only change the price if they set a price on invoiceing in the org-offering table) // // only show orgs that offer this offering -- or if editing booking and offering not offered by that org, still show the org ArrayList orgsList = new ArrayList(); int offeringID = IsValidFormOffering() ? GetFormOffering() : -1; Booking editBooking = IsEditBookingMode() && IsValidFormBooking() ? BookingDB.GetByID(GetFormBooking()) : null; for (int i = 0; i < orgIDs.Length; i++) { //if (offeringID == -1 || OrganisationOfferingsDB.IsOfferingOfferedyByOrg(offeringID, orgIDs[i]) || (editBooking != null && editBooking.Organisation.OrganisationID == orgIDs[i])) orgsList.Add(OrganisationDB.GetByID(orgIDs[i])); } this.orgs = (Organisation[])orgsList.ToArray(typeof(Organisation)); // foreach day: // foreach org: // add date:[orgs:[staff]] if (Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["LogAllSqlStackTraces"])) Logger.LogQuery("START TIME - GET STAFF WORKING AT ALL BOOKING PAGE ORGS"); DataTable tblAllRegisteredStaff = RegisterStaffDB.GetDataTable_All(); DataTable tblUnavailableProvBookingsFullDays = BookingDB.GetUnavailableProvBookingsBetween(orgIDs, GetFormDate(), GetFormDate().AddDays(GetFormNumDays())); // // need to get the staff list before getting the bookings because when we get bookings with 'staff' put in, // we get where staff are booked other organisations, which needs to be shown // Hashtable allStaff = new Hashtable(); DateTime day = GetFormDate(); for (int i = 0; i < GetFormNumDays(); day = day.AddDays(1), i++) { for (int j = 0; j < this.orgs.Length; j++) { StartEndTime orgStartEndTime = this.orgs[j].GetStartEndTime(day.DayOfWeek); bool orgOpen = ((this.orgs[j].StartDate == DateTime.MinValue || this.orgs[j].StartDate <= day) && (this.orgs[j].EndDate == DateTime.MinValue || this.orgs[j].EndDate >= day) && (this.orgs[j].IsOpen(day.DayOfWeek)) && (orgStartEndTime.StartTime < orgStartEndTime.EndTime)); Staff[] workingStaff = GetWorkingStaffFor(orgs[j].OrganisationID, true, day, null, tblAllRegisteredStaff, tblUnavailableProvBookingsFullDays, GetFormShowUnavailableStaff()); for (int k = 0; k < workingStaff.Length; k++) allStaff[workingStaff[k].StaffID] = workingStaff[k]; } } Staff[] staff = new Staff[allStaff.Values.Count]; allStaff.Values.CopyTo(staff, 0); // get all bookings for these orgs between the dates -- irregardless of provider // so we can add providers who have bookings before but are no longer registered to this clinic or are no longer set as a provider Booking[] bookingsTheseOrgs = BookingDB.GetBetween(debugPageLoadTime, GetFormDate(), GetFormDate().AddDays(GetFormNumDays()), staff, this.orgs, null, null); this.bookings = bookingsTheseOrgs; // save to use results again when displaying page... this.daysData = new DayData[GetFormNumDays()]; day = GetFormDate(); for (int i = 0; i < GetFormNumDays(); day = day.AddDays(1), i++) { OrgDayData[] orgDayData = new OrgDayData[this.orgs.Length]; for (int j = 0; j < this.orgs.Length; j++) { StartEndTime orgStartEndTime = this.orgs[j].GetStartEndTime(day.DayOfWeek); bool orgOpen = ((this.orgs[j].StartDate == DateTime.MinValue || this.orgs[j].StartDate <= day) && (this.orgs[j].EndDate == DateTime.MinValue || this.orgs[j].EndDate >= day) && (this.orgs[j].IsOpen(day.DayOfWeek)) && (orgStartEndTime.StartTime < orgStartEndTime.EndTime)); //orgDayData[j] = new OrgDayData(this.orgs[j], RegisterStaffDB.GetWorkingStaffOf(orgs[j].OrganisationID, day)); // THIS IS VERY SLOW, SO CREATED BELOW LINE orgDayData[j] = new OrgDayData(this.orgs[j], GetWorkingStaffFor(orgs[j].OrganisationID, orgOpen, day, bookingsTheseOrgs, tblAllRegisteredStaff, tblUnavailableProvBookingsFullDays, GetFormShowUnavailableStaff())); if (orgDayData[j].NCols == 0) // need to put in blank column if no staff allocated orgDayData[j].StaffList = new Staff[] { null }; } this.daysData[i] = new DayData(day, orgDayData); } // if there is a booking for a staff member who is now set as not working on this day at this org: // then this staff memeber will be showing (as it shows staff who have 'existing' bookings but not set as working that day), but // the last code will not get bookings for other orgs for this staff memmber // so this checks for those staff, and if so, has to re-get the list of bookings including for that staff memeber // // most of the time this should not be called, so the db lookups will stay minimal if (staff.Length < this.staffList.Length) { bookingsTheseOrgs = BookingDB.GetBetween(debugPageLoadTime, GetFormDate(), GetFormDate().AddDays(GetFormNumDays()), this.staffList, this.orgs, null, null); this.bookings = bookingsTheseOrgs; // save to use results again when displaying page... this.daysData = new DayData[GetFormNumDays()]; day = GetFormDate(); for (int i = 0; i < GetFormNumDays(); day = day.AddDays(1), i++) { OrgDayData[] orgDayData = new OrgDayData[this.orgs.Length]; for (int j = 0; j < this.orgs.Length; j++) { StartEndTime orgStartEndTime = this.orgs[j].GetStartEndTime(day.DayOfWeek); bool orgOpen = ((this.orgs[j].StartDate == DateTime.MinValue || this.orgs[j].StartDate <= day) && (this.orgs[j].EndDate == DateTime.MinValue || this.orgs[j].EndDate >= day) && (this.orgs[j].IsOpen(day.DayOfWeek)) && (orgStartEndTime.StartTime < orgStartEndTime.EndTime)); //orgDayData[j] = new OrgDayData(this.orgs[j], RegisterStaffDB.GetWorkingStaffOf(orgs[j].OrganisationID, day)); // THIS IS VERY SLOW, SO CREATED BELOW LINE orgDayData[j] = new OrgDayData(this.orgs[j], GetWorkingStaffFor(orgs[j].OrganisationID, orgOpen, day, bookingsTheseOrgs, tblAllRegisteredStaff, tblUnavailableProvBookingsFullDays, GetFormShowUnavailableStaff())); if (orgDayData[j].NCols == 0) // need to put in blank column if no staff allocated orgDayData[j].StaffList = new Staff[] { null }; } this.daysData[i] = new DayData(day, orgDayData); } } if (Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["LogAllSqlStackTraces"])) Logger.LogQuery("END TIME - GET STAFF WORKING AT ALL BOOKING PAGE ORGS"); this.bookingSlotMinsCache = new BookingSlotMinsCache(this.orgs.Length == 0 ? 0 : this.orgs[0].OrganisationID); }
public DayData(DateTime Date, OrgDayData[] OrgDayData) { this.Date = Date; this.OrgDayData = OrgDayData; }