Ejemplo n.º 1
0
        public IEnumerable <(string, TaskControl)> GetFullShortage(DateTime?endTime = null)
        {
            var taskControl_Items = Db.TaskControl_Items
                                    .Where(x => x.HeadId == TaskControl_Head.Id);

            if (TimeUnit == TimeUnit.Infinity)
            {
                var valami = Db.TaskControl_Items
                             .Where(x => x.HeadId == TaskControl_Head.Id)
                             .Include(x => x.TimeRanges)
                             //.SelectMany(x => x.TimeRanges, (i, tr) => new {i, tr})
                             //.Where(x => !x.tr.Any())
                             .ToHashSet()
                             .Where(x => !x.TimeRanges.Any());

                foreach (var taskControl_Item in valami)
                {
                    var res = new TaskControl(TimeUnit);
                    res.AddTimeRange(TimeRange.Infinity());
                    yield return(taskControl_Item.Code, res);
                }
            }
            else
            {
                foreach (var taskControl_Item in taskControl_Items)
                {
                    var res = new DbTaskControl(Db, TimeUnit, TimeType, TaskControlDomain, taskControl_Item.Code, taskControl_Item.DateTimeStart)
                              .GetShortage(endTime);
                    yield return(taskControl_Item.Code, res);
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Invertálja a Timeranges-t. Olyan időintervallumokat tartalmazó TimeControl -t ad vissza, ami a beadott dátumok közötti összes meg nem jelölt időszakot tartalmazza.
        /// </summary>
        public TaskControl GetInverseTimeControl(TimeRange timeRange)
        {
            var res = new TaskControl(TimeUnit);

            ReloadData();
            if (TimeUnit == TimeUnit.Infinity)
            {
                if (TimeRanges.Any())
                {
                    res.RemoveTimeRange(TimeRange.Infinity());
                }
                else
                {
                    res.AddTimeRange(TimeRange.Infinity());
                }
            }
            else
            {
                //Ez az az időpont, amelyik már éppen NINCS benne a vizsgált időszakban
                DateTime realStartTime = TimeFunctions.TruncDateTime(TimeUnit, timeRange.DateTimeStart);
                DateTime realEndTime   = timeRange.EndOfTimeRange(TimeUnit);


                /*if (TimeType == TimeType.Moment)//Ha időpontot vizsgálok, akkor a záró időpontot kiterjesztem a megadott időpontot tartalmazó időszak végéig.
                 *      realEndTime = AddDateTime(realEndTime, 1);
                 * else//Ha időszakot vizsgálok, akkor a kapott endtime paraméterben levő időpontot még intervallumon belülinek veszem, ezért a záró időpontot kiterjesztem 1 legkisebb időegységgel.
                 *      realEndTime = realEndTime/*.AddTicks(1)*/
                ;
                //realEndTime =

                var trInInterval = TimeRanges.Where(x => x.EndOfTimeRange(TimeUnit) > realStartTime && x.DateTimeStart < realEndTime).OrderBy(x => x.DateTimeStart);


                //első időszak előtti rész
                var first = trInInterval.FirstOrDefault();
                if (first != null && first.DateTimeStart > realStartTime)
                {
                    var tr = newTaskControl_TimeRange(realStartTime, TimeCountBetween(realStartTime, first.DateTimeStart));
                    res.TimeRanges.Add(tr);
                }


                TaskControl_TimeRange?prevTimeRange = null;

                //hozzáadom az egyes időintervallumok között kihagyott időszakokat
                foreach (var actTimeRange in trInInterval)
                {
                    if (prevTimeRange != null)
                    {
                        var starttime = prevTimeRange.EndOfTimeRange(TimeUnit);
                        var tr        = newTaskControl_TimeRange(starttime, TimeCountBetween(starttime, actTimeRange.DateTimeStart));

                        if (tr.DurationCount > 0)
                        {
                            res.TimeRanges.Add(tr);
                        }
                    }
                    prevTimeRange = actTimeRange;
                }

                //hozzáadom az utolsó utáni-t
                var last = trInInterval.LastOrDefault();
                if (last != null && AddDateTime(last.DateTimeStart, last.DurationCount) < realEndTime)
                {
                    var starttime = last.EndOfTimeRange(TimeUnit);
                    var tr        = newTaskControl_TimeRange(starttime, TimeCountBetween(starttime, realEndTime));
                    if (tr.DurationCount > 0)
                    {
                        res.TimeRanges.Add(tr);
                    }
                }

                if (!trInInterval.Any())
                {
                    var tr = newTaskControl_TimeRange(realStartTime, TimeCountBetween(realStartTime, realEndTime));
                    res.TimeRanges.Add(tr);
                }
            }
            return(res);
        }