using System; using System.Collections.Generic; using System.ComponentModel; using System.Runtime.Serialization; using BS.Shared.Extensions; namespace BS.Shared.Core { [DataContract] public class DateTimeSpan : INotifyPropertyChanged { public static string PropertyName_EndDate = "EndDate"; public static string PropertyName_EndDateTime = "EndDateTime"; public static string PropertyName_EndHours = "EndHours"; public static string PropertyName_EndMinutes = "EndMinutes"; public static string PropertyName_StartDate = "StartDate"; public static string PropertyName_StartDateTime = "StartDateTime"; public static string PropertyName_StartHours = "StartHours"; public static string PropertyName_StartMinutes = "StartMinutes"; private DateTime _EndDate; private int _EndHours; private int _EndMinutes; private DateTime _StartDate; private int _StartHours; private int _StartMinutes; private bool _SynchEndDate; public DateTimeSpan() { } public DateTimeSpan(DateTime start, DateTime ende) { _StartDate = start; _EndDate = ende; } public DateTimeSpan(DateTime start, DateTime end, bool isCalculatingHoursAndMinutesByDates) { IsCalculatingHoursAndMinutesByDates = isCalculatingHoursAndMinutesByDates; StartDate = start; EndDate = end; } public DateTime EndDate { get { return _EndDate; } set { _EndDate = value; if (IsCalculatingHoursAndMinutesByDates) { _EndHours = value.Hour; _EndMinutes = value.Minute; } FirePropertyChanged(PropertyName_EndDate); FirePropertyChanged(PropertyName_EndDateTime); } } [DataMember] public DateTime EndDateTime { get { return _EndDate.Date.AddHours(_EndHours).AddMinutes(_EndMinutes); } set { EndDate = value.Date; EndHours = value.Hour; EndMinutes = value.Minute; } } public int EndHours { get { return _EndHours; } set { _EndHours = value; FirePropertyChanged(PropertyName_EndHours); FirePropertyChanged(PropertyName_EndDateTime); } } public int EndMinutes { get { return _EndMinutes; } set { _EndMinutes = value; FirePropertyChanged(PropertyName_EndMinutes); FirePropertyChanged(PropertyName_EndDateTime); } } public DateTime StartDate { get { return _StartDate; } set { _StartDate = value; if (IsCalculatingHoursAndMinutesByDates) { _StartHours = value.Hour; _StartMinutes = value.Minute; } FirePropertyChanged(PropertyName_StartDate); FirePropertyChanged(PropertyName_StartDateTime); if (_SynchEndDate) { SynchronizeEndDate(); } } } [DataMember] public DateTime StartDateTime { get { return _StartDate.Date.AddHours(_StartHours).AddMinutes(_StartMinutes); } set { StartDate = value.Date; StartHours = value.Hour; StartMinutes = value.Minute; } } public int StartHours { get { return _StartHours; } set { _StartHours = value; FirePropertyChanged(PropertyName_StartHours); FirePropertyChanged(PropertyName_StartDateTime); if (_SynchEndDate) { SynchronizeEndDate(); } } } public int StartMinutes { get { return _StartMinutes; } set { _StartMinutes = value; FirePropertyChanged(PropertyName_StartMinutes); FirePropertyChanged(PropertyName_StartDateTime); if (_SynchEndDate) { SynchronizeEndDate(); } } } public bool SynchEndDate { get { return _SynchEndDate; } set { _SynchEndDate = value; } } public event PropertyChangedEventHandler PropertyChanged; public DateTimeSpan Clone() { return new DateTimeSpan { StartDateTime = StartDateTime, EndDateTime = EndDateTime }; } public override bool Equals(object obj) { if (!(obj is DateTimeSpan)) { return false; } return ((DateTimeSpan) obj).EndDateTime == EndDateTime && ((DateTimeSpan) obj).StartDateTime == StartDateTime; } public override int GetHashCode() { return StartDateTime.GetHashCode() ^ EndDateTime.GetHashCode(); } public TimeSpan GetTimeSpan() { return EndDateTime - StartDateTime; } public IEnumerable GetWholeWeeks() { return GetWeeks(false, true); } public IEnumerable GetWeeks(bool endOnSunday, bool onlyWholeWeeks) { var lResult = new List(); DateTime startDate = StartDate; DateTime endDate = StartDate; if (endOnSunday) { while (endDate.DayOfWeek != DayOfWeek.Sunday) { endDate = endDate.AddDays(1); } } else { endDate = endDate.AddDays(6); } DateTime totalEnddate = EndDate; if (totalEnddate == DateTime.MaxValue.Date) totalEnddate = StartDate.AddYears(1); while (endDate <= totalEnddate) { var lCurrentWorkWeek = new DateTimeSpan { StartDateTime = startDate, EndDateTime = endDate }; lResult.Add(lCurrentWorkWeek); startDate = endDate.AddDays(1); endDate = startDate.AddDays(6); if (!onlyWholeWeeks && endDate > totalEnddate) { lCurrentWorkWeek = new DateTimeSpan { StartDateTime = startDate, EndDateTime = totalEnddate }; lResult.Add(lCurrentWorkWeek); } } return lResult; } public bool Overlaps(DateTimeSpan pDateSpan2) { DateTime lThisEnd = EndDateTime.AddMilliseconds(-1); DateTime lOtherEnd = pDateSpan2.EndDateTime.AddMilliseconds(-1); return StartDateTime.InBetween(pDateSpan2.StartDateTime, lOtherEnd, false) || lThisEnd.InBetween(pDateSpan2.StartDateTime, lOtherEnd, false) || (StartDateTime <= pDateSpan2.StartDateTime && lThisEnd >= lOtherEnd); } public string ToDateString() { return StartDateTime.ToMyDateTimeString() + " - " + EndDateTime.ToMyDateTimeString(); } public override string ToString() { return StartDateTime.ToMyDateTimeString() + " " + StartDateTime.ToShortTimeString() + " - " + EndDateTime.ToMyDateTimeString() + " " + EndDateTime.ToShortTimeString(); } private void FirePropertyChanged(string pPropertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(pPropertyName)); } } private void SynchronizeEndDate() { if (EndDateTime < StartDateTime) { EndDateTime = StartDateTime; } } public bool ContainsDate(DateTime dt) { DateTime endDate = EndDate; if (endDate < DateTime.MaxValue.Date) endDate = endDate.AddDays(1); return StartDate <= dt && dt < endDate; } public TimeSpan StartDateAsTimeSpan { get { return StartDate.AddHours(StartHours).AddMinutes(StartMinutes).TimeOfDay; } set { StartHours = value.Hours; StartMinutes = value.Minutes; } } public TimeSpan EndDateAsTimeSpan { get { return EndDate.AddHours(EndHours).AddMinutes(EndMinutes).TimeOfDay; } set { EndHours = value.Hours; EndMinutes = value.Minutes; } } public bool IsCalculatingHoursAndMinutesByDates { get; set; } public bool EqualTimes(DateTimeSpan dateTimeSpan) { return StartHours.Equals(dateTimeSpan.StartHours) && StartMinutes.Equals(dateTimeSpan.StartMinutes) && EndHours.Equals(dateTimeSpan.EndHours) && EndMinutes.Equals(dateTimeSpan.EndMinutes); } } }