Пример #1
0
        public static DateTime ObterProximoDiaUtil(this DateTime d, DateTime data, GestaoSLA.CalendarioDeTrabalho calendario, List <GestaoSLA.Feriado> feriados)
        {
            // Objeto que vai gerenciar o calendario de datas.
            var calendar = new GregorianCalendar();

            while (true)
            {
                // Recuperando o dia da semana que representa a data de vencimento.
                DayOfWeek diaDaSemana = calendar.GetDayOfWeek(data);

                // Verificando se a data é feriado
                var feriado = feriados.Find(h => h.DataInicio.Date == data.Date);

                var isHoliday = feriado != null;

                // Verificando se é um dia de descanso do execution responsible.
                var isRestDay = calendario.ObterDiasDeDescanso().ContainsKey(diaDaSemana);

                if (isRestDay)
                {
                    data = data.AddDays(1);
                }
                else
                {
                    if (isHoliday)
                    {
                        if (!feriado.DiaTodo)
                        {
                            var day = calendario.ObterDiaDaSemana(data);

                            var start = feriado.DataInicio;
                            var end   = feriado.DataFim;

                            if (feriado.DataInicio.Hour < day.Inicio.Hours)
                            {
                                start = new DateTime(feriado.DataInicio.Year, feriado.DataInicio.Month, feriado.DataInicio.Day, day.Inicio.Hours, day.Inicio.Minutes, day.Inicio.Seconds);
                            }

                            if (feriado.DataFim.Hour > day.Fim.Hours)
                            {
                                end = new DateTime(feriado.DataFim.Year, feriado.DataFim.Month, feriado.DataFim.Day, day.Fim.Hours, day.Fim.Minutes, day.Fim.Seconds);
                            }

                            var remmaingBalance = end.Subtract(start);
                            data = data.AddMinutes(remmaingBalance.TotalMinutes);

                            break;
                        }
                        else
                        {
                            data = data.AddDays(1);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }

            return(data);
        }