Exemple #1
0
 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);
     }
 }
Exemple #2
0
        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);
            }
        }