private int CalculateAbsences(Period period, AbstractCalendarEntry entry)
        {
            var p = GetNormalizedPeriod(period);

            if (!(entry.To >= p.Start && entry.From <= p.End))
            {
                return(0);
            }

            if (entry.From >= p.Start && entry.To <= p.End)
            {
                return(entry.To.Day - entry.From.Day + 1);
            }

            if (entry.From <= p.Start && entry.To >= p.End)
            {
                return(p.End.Day - p.Start.Day + 1);
            }

            if (entry.From <= p.Start && entry.To <= p.End)
            {
                return(entry.To.Day - p.Start.Day + 1);
            }

            if (entry.From >= p.Start && entry.To >= p.End)
            {
                return(p.End.Day - entry.From.Day + 1);
            }
            return(0);
        }
        private int GetCoefficient(AbstractCalendarEntry e, int year, int month)
        {
            var periodId = Periods
                           .First(p => p.Start.Year == year && p.Start.Month == month)
                           .Id;

            var resourceId = e.CalendarEmployee.Employee.Id;

            return(Capacities
                   .First(rc => rc.ResourceId == resourceId && rc.PeriodId == periodId)
                   .Capacity);
        }
        private Dictionary <string, int> GetWorkDaysCountFromDataRange(Tuple <int, int> fromDataTuple, Tuple <int, int> toDataTuple, int year, AbstractCalendarEntry e)
        {
            var startDay   = 0;
            var endDay     = 0;
            var startMonth = 0;
            var endMonth   = 0;
            var result     = new Dictionary <string, int>();

            if (fromDataTuple.Item1 == -1 && toDataTuple.Item1 != -1)
            {
                startMonth = 1;
                startDay   = 1;
                endMonth   = toDataTuple.Item1;
                endDay     = toDataTuple.Item2;
            }
            else if (fromDataTuple.Item1 != -1 && toDataTuple.Item1 == -1)
            {
                startMonth = fromDataTuple.Item1;
                startDay   = fromDataTuple.Item2;
                endMonth   = 12;
                endDay     = 31;
            }
            else
            {
                startMonth = fromDataTuple.Item1;
                startDay   = fromDataTuple.Item2;
                endMonth   = toDataTuple.Item1;
                endDay     = toDataTuple.Item2;
            }


            for (int i = startMonth; i <= endMonth; i++)
            {
                string monthName = new DateTime(year, i, 1).GetMonthName().ToLower();
                var    coef      = GetCoefficient(e, year, i);

                var lastDay = 0;
                if (i == endMonth)
                {
                    lastDay = endDay;
                }
                else
                {
                    lastDay = DateTime.DaysInMonth(year, i);
                }

                var firstDay = 0;
                if (i != startMonth)
                {
                    firstDay = 1;
                }
                else
                {
                    firstDay = startDay;
                }


                var allWorkDays         = GetWorkDaysCountInMonth(year, i, 1, DateTime.DaysInMonth(year, i));
                var workDaysWithAbsence = GetWorkDaysCountInMonth(year, i, firstDay, lastDay);

                int value = Convert.ToInt32((((double)(workDaysWithAbsence)) / (double)allWorkDays * coef));

                if (!result.ContainsKey(monthName))
                {
                    result[monthName] = 0;
                }

                result[monthName] += value;
            }

            return(result);
        }