Função para retornar o dia útil. (c#) 3


A seguir um algoritmo que retorna o próximo dia útil do mês verificando também os feriados através de uma base de dados.

C-sharp

O script está escrito em C# mas ao final do post há um link para uma implementação em PHP caso prefira.

Vamos ao script:

public static DateTime diaUtil(DateTime dt)
{
	while (true)
	{
		if (dt.DayOfWeek == DayOfWeek.Saturday)
		{
			dt = dt.AddDays(2);
			return diaUtil(dt);
		}
		else if (dt.DayOfWeek == DayOfWeek.Sunday)
		{
			dt = dt.AddDays(1);
			return diaUtil(dt);
		}
		else if (Feriado(dt) == true)
		{
			dt = dt.AddDays(1);
			return diaUtil(dt);
		}
		else return dt;
	}
}
public static bool Feriado(DateTime dt)
{
	String strConn;
	strConn = "Data Source=localhost;Initial Catalog=Banco;";
        strConn += "User ID=Usuario;Password=Senha;Max Pool Size=150; Connection Lifetime=0";
	string sqlFeriado = "";
	sqlFeriado += "SELECT dtferiado FROM  feriado ";
	sqlFeriado += "WHERE dtferiado = '";
        sqlFeriado += dt.ToString("dd/MM/yyyy") + "'";
	SqlConnection objConnFeriado;
	SqlCommand cmdFeriado = new SqlCommand();
	objConnFeriado = new SqlConnection(strConn);
	objConnFeriado.Open();
	cmdFeriado.Connection = objConnFeriado;
	cmdFeriado.CommandText = sqlFeriado;
	SqlDataReader objDRFeriado = cmdFeriado.ExecuteReader();
	if (objDRFeriado.Read())
		return true;
	else
		return false;
	objDRFeriado.Close();
	objConnFeriado.Close();
}

A função ‘Feriado’ é necessária para saber se o dia passado por parâmetro é um feriado. Essa função utiliza uma conexão com banco de dados SQL Server facilmente adaptada para outros bancos.  A tabela feriado em questão possui apenas um campo do tipo DateTime com a data do feriado.

A função recursiva ‘diaUtil’ verifica primeiro se o dia é sábado ou domingo, avançando a data para segunda feira caso afirmativo. Logo após é verificado se é feriado com a função citada acima. O laço de repetição é feito enquanto não se encontrar uma data válida como sendo um dia útil. Para utilizar a função basta chama-la passando uma data como referência. Será retornado o primeiro dia útil encontrado. Por exemplo: para saber o primeiro dia útil do próximo mês você poderá fazer.

DateTime dt = DateTime.Now.AddMonths(1);
dt = diaUtil(Convert.ToDateTime("01/" + dt.ToString("MM") +
     "/" + dt.ToString("yyyy")));

Para uma implementação em PHP veja este post do Felipe Marques.

Related Posts Plugin for WordPress, Blogger...