public static Recurrence[] GetRecurrences(string serviceBrokerGuid, string groupName, string labServerGuid, string clientGuid, DateTime startTime, DateTime endTime) { TimeBlock range = new TimeBlock(startTime, endTime); List<Recurrence> recurrences = new List<Recurrence>(); DbConnection connection = FactoryDB.GetConnection(); // create sql command // command executes the "RetrieveRecurrenceIDs" stored procedure DbCommand cmd = FactoryDB.CreateCommand("Recurrences_Retrieve", connection); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(FactoryDB.CreateParameter(cmd,"@sbGuid", serviceBrokerGuid, DbType.AnsiString, 50)); cmd.Parameters.Add(FactoryDB.CreateParameter(cmd,"@group", groupName, DbType.String, 256)); cmd.Parameters.Add(FactoryDB.CreateParameter(cmd,"@lsGuid", labServerGuid, DbType.AnsiString, 50)); cmd.Parameters.Add(FactoryDB.CreateParameter(cmd,"@clientGuid", clientGuid, DbType.AnsiString, 50)); cmd.Parameters.Add(FactoryDB.CreateParameter(cmd,"@start", DateUtil.SpecifyUTC(startTime), DbType.DateTime)); cmd.Parameters.Add(FactoryDB.CreateParameter(cmd,"@end", DateUtil.SpecifyUTC(endTime), DbType.DateTime)); try { DbDataReader dataReader = null; Recurrence recur = null; connection.Open(); //recurrence_id,resource_id,recurrence_type,day_mask,recurrence_start_date,recurrence_num_days //recurrence_start_offset,recurrence_end_offset, quantum dataReader = cmd.ExecuteReader(); while (dataReader.Read()) { recur = new Recurrence(); recur.recurrenceId = dataReader.GetInt32(0); recur.resourceId = dataReader.GetInt32(1); recur.recurrenceType = (Recurrence.RecurrenceType)dataReader.GetInt32(2); recur.dayMask = dataReader.GetByte(3); recur.startDate = DateUtil.SpecifyUTC(dataReader.GetDateTime(4)); recur.numDays = dataReader.GetInt32(5); recur.startOffset = TimeSpan.FromSeconds((double)dataReader.GetInt32(6)); recur.endOffset = TimeSpan.FromSeconds((double)dataReader.GetInt32(7)); recur.quantum = dataReader.GetInt32(8); TimeBlock[] blocks = recur.GetTimeBlocks(); foreach (TimeBlock tb in blocks) { if (range.Intersects(tb)) { recurrences.Add(recur); break; } } } dataReader.Close(); } catch (Exception ex) { throw new Exception("Exception thrown in get recurrences", ex); } finally { connection.Close(); } return recurrences.ToArray(); }
private void renderTimePeriods(HtmlTextWriter output, DateTime date, IEnumerable periods) { TimeBlock validTime = new TimeBlock(date.AddHours((int)minTOD.Hours), date.AddHours((int)maxTOD.TotalHours)); if (periods != null) { IEnumerator enumTP = null; try { enumTP = periods.GetEnumerator(); enumTP.MoveNext(); TimePeriod first = (TimePeriod)enumTP.Current; if (first.Start > validTime.Start) { renderVoidTime(output, Convert.ToInt32((first.Start - validTime.Start).TotalSeconds)); } } catch (Exception ex) { } finally { enumTP.Reset(); } foreach (TimePeriod tp in periods) { if (validTime.Intersects(tp)) { TimeBlock valid = validTime.Intersection(tp); if (tp.quantum == 0) { renderScheduledTime(output, valid); } else { int cellDur = 0; int tDur = valid.Duration; DateTime cur = valid.Start; DateTime end = valid.End; while (cur < end) { cellDur = defaultCellDuration -(cur.TimeOfDay.Minutes % defaultCellDuration); if(cellDur < defaultCellDuration) cellDur += defaultCellDuration; if ((end - cur.AddMinutes(cellDur)).TotalMinutes < (defaultCellDuration/2)) { cellDur += Convert.ToInt32((end - cur.AddMinutes(cellDur)).TotalMinutes ); } cellDur = (cur.AddMinutes(cellDur) <= end) ? cellDur : (int)(end - cur).TotalMinutes; renderAvailableTime(output, cur, tDur, tp.quantum, cellDur * 60, false); cur = cur.AddMinutes(cellDur); tDur = tDur - (cellDur * 60); //cellDur = (cur.TimeOfDay.Minutes % defaultCellDuration) + defaultCellDuration; //cellDur = (cur.AddMinutes(cellDur) <= end) ? cellDur : (int)(end - cur).TotalMinutes; //renderAvailableTime(output, cur, tDur, tp.quantum, cellDur * 60, false); //cur = cur.AddMinutes(cellDur); //tDur = tDur - (cellDur * 60); } } } } } }
protected override void PerformDataBinding(IEnumerable schedulingData) { // don't bind in design mode if (DesignMode) { return; } base.PerformDataBinding(schedulingData); MinTOD = TimeSpan.Zero; MaxTOD = oneDay; // Verify data exists. if (schedulingData != null) { if (NumDays == 1) { TimeSpan tmpTS; TimeSpan tmpMinTOD = oneDay; //Check the first timeBlock IEnumerator eTB = schedulingData.GetEnumerator(); if (eTB.MoveNext()) { tmpTS = (( TimeBlock)eTB.Current).Start.AddMinutes(userTZ).TimeOfDay; if (tmpMinTOD > tmpTS) { tmpMinTOD = tmpTS; MinTOD = tmpMinTOD; } } } if (bindReservations) { // should be Reservations reservations = new List<Reservation>(); foreach (Reservation r in schedulingData) { reservations.Add(r); } } else { // should be TimePeriods TimeBlock range = new TimeBlock(StartTime, EndTime); periods = new List<TimePeriod>(); foreach (TimePeriod tp in schedulingData) { if(range.Contains(tp)){ periods.Add(tp); } else if (range.Intersects(tp)) { TimeBlock tmpTB = range.Intersection(tp); periods.Add(new TimePeriod(tmpTB.Start, tmpTB.Duration, tp.quantum)); } } TimeBlock[] scheduledTBs = TimeBlock.Remaining(new TimeBlock[] { range }, periods.ToArray()); if (scheduledTBs != null && scheduledTBs.Length > 0) { periods.AddRange(TimePeriod.MakeArray(scheduledTBs, 0)); } periods.Sort(); } } else { periods = new List<TimePeriod>(); periods.Add(new TimePeriod(StartTime, EndTime, 0)); } }
protected override void PerformDataBinding(IEnumerable schedulingData) { // don't bind in design mode if (DesignMode) { return; } base.PerformDataBinding(schedulingData); // Verify data exists. if (schedulingData != null) { TimeSpan tmpTS; TimeSpan oneDay = TimeSpan.FromDays(1); maxTOD = TimeSpan.Zero.Subtract(TimeSpan.FromMinutes(userTZ)); minTOD = oneDay; foreach (ITimeBlock tb in schedulingData) { tmpTS = tb.Start.AddMinutes(userTZ).TimeOfDay; if (minTOD > tmpTS) minTOD = tmpTS; tmpTS = tmpTS.Add(TimeSpan.FromSeconds(tb.Duration)); if (tmpTS.TotalHours < 24) { if (maxTOD < tmpTS) { maxTOD = tmpTS; } } else if (tmpTS.TotalHours == 24) { maxTOD = tmpTS; } else { minTOD = TimeSpan.Zero; maxTOD = TimeSpan.FromHours(24); break; } } if (bindReservations) { // should be Reservations reservations = new List<Reservation>(); foreach (Reservation r in schedulingData) { reservations.Add(r); } } else { // should be TimePeriods TimeBlock range = new TimeBlock(StartTime, EndTime); periods = new List<TimePeriod>(); foreach (TimePeriod tp in schedulingData) { if(range.Contains(tp)){ periods.Add(tp); } else if (range.Intersects(tp)) { TimeBlock tmpTB = range.Intersection(tp); periods.Add(new TimePeriod(tmpTB.Start, tmpTB.Duration, tp.quantum)); } } TimeBlock[] scheduledTBs = TimeBlock.Remaining(new TimeBlock[] { range }, periods.ToArray()); if (scheduledTBs != null && scheduledTBs.Length > 0) { periods.AddRange(TimePeriod.MakeArray(scheduledTBs, 0)); } periods.Sort(); } } else { minTOD = TimeSpan.Zero; maxTOD = TimeSpan.FromHours(24); periods = new List<TimePeriod>(); periods.Add(new TimePeriod(StartTime, EndTime, 0)); } }
private void renderTimePeriods(HtmlTextWriter output, DateTime date, List<TimePeriod> periods) { TimeBlock validTime = new TimeBlock(date.AddHours((int)minTOD.Hours), endTime); TimeBlock valid; DateTime cur = DateTime.MinValue; DateTime end = DateTime.MinValue; if (periods != null && periods.Count >0) { try { TimePeriod first = periods[0]; if (first.Start > validTime.Start) { renderVoidTime(output, Convert.ToInt32((first.Start - validTime.Start).TotalSeconds)); } } catch (Exception ex) { throw ex; } foreach (TimePeriod tp in periods) { if (validTime.Intersects(tp)) { valid = validTime.Intersection(tp); cur = valid.Start; end = valid.End; if (tp.quantum == 0) { renderScheduledTime(output, valid); } else { int cellDur = 0; int tDur = valid.Duration; while (cur < end && cur < endOfDay) { cellDur = defaultCellDuration -( cur.TimeOfDay.Minutes % defaultCellDuration); if(cellDur < defaultCellDuration) cellDur += defaultCellDuration; if ((end - cur.AddMinutes(cellDur)).TotalMinutes < (defaultCellDuration/2)) { cellDur += Convert.ToInt32((end - cur.AddMinutes(cellDur)).TotalMinutes ); } cellDur = (cur.AddMinutes(cellDur) <= endOfDay) ? cellDur : (int)(endOfDay - cur).TotalMinutes; renderAvailableTime(output, cur, tDur, tp.quantum, cellDur * 60, false); cur = cur.AddMinutes(cellDur); tDur = tDur - (cellDur * 60); } } } } // End of foreach period if (end < endOfDay) { renderScheduledTime(output, new TimeBlock(end,endOfDay)); } } }