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); }