public static WorkInterval AtOffice(this IEnumerable <Input> data, IContract contract) { if (data.Any(x => !x.TerminalServerSession)) { var w = new WorkInterval(); w.TimeInterval = new Sidi.Util.TimeInterval( data.First(x => !x.TerminalServerSession).Begin, data.Last(x => !x.TerminalServerSession).End); if (w.TimeInterval.Duration > contract.MaxWorkTimePerDay) { w.TimeInterval = new Sidi.Util.TimeInterval( w.TimeInterval.Begin, w.TimeInterval.Begin + contract.MaxWorkTimePerDay); } w.Place = Place.Office; return(w); } else { return(null); } }
public static IEnumerable <WorkInterval> WorkIntervals(this IEnumerable <Input> data, IContract contract) { WorkInterval atOffice = null; WorkInterval extraOffice = null; DateTime leave = DateTime.MinValue; if (data.Any(x => !x.TerminalServerSession)) { leave = data.Last(x => !x.TerminalServerSession).End; atOffice = new WorkInterval() { TimeInterval = new TimeInterval( data.First(x => !x.TerminalServerSession).Begin, leave) }; if (atOffice.TimeInterval.Duration > contract.MaxWorkTimePerDay) { atOffice.TimeInterval = new TimeInterval( atOffice.TimeInterval.Begin, contract.MaxWorkTimePerDay); extraOffice = new WorkInterval() { TimeInterval = new TimeInterval( atOffice.TimeInterval.End, leave) }; extraOffice.Place = Place.OverHr; } atOffice.Place = Place.Office; } IEnumerable <Input> atHome; if (atOffice != null) { yield return(atOffice); if (extraOffice != null) { yield return(extraOffice); } atHome = data.Where(x => x.End <atOffice.TimeInterval.Begin || x.Begin> leave); } else { atHome = data; } WorkInterval w = null; foreach (var i in atHome) { if (w != null) { if (w.TimeInterval.End + contract.MaxHomeOfficeIdleTime >= i.Begin) { w.TimeInterval = new TimeInterval(w.TimeInterval.Begin, i.End); } else { yield return(w); w = null; } } if (w == null) { w = new WorkInterval(); w.Place = Place.Home; w.TimeInterval = new TimeInterval(i.Begin, i.End); } } if (w != null) { yield return(w); } }