class function TFuncoesClass.TratarDiasUteis(data: TDate): TDate;
// Tratar final de semana, sabado e domingo jogar para segunda feira
function TratarFinalSemana(data: TDate): TDate;
begin
// Domingo - > + 1 para ir para segunda
if (DayOfWeek(data) = 1) then
Result := IncDay(data, 1)
// Sabado - > + 2 para ir para segunda
else if (DayOfWeek(data) = 7) then
Result := IncDay(data, 2)
// Segunda, terça, quarta, quinta, sexta - feira , resutlar a própria data
else
Result := data;
end;
// tratar a data da pascoa, pois descobrindo a pascoa chegaremos a sexta feira santa
function SextaFeiraSanta(data: TDate): String;
var
dia,
mes,
ano: Word;
x,
y,
resto1,
resto2,
resto3,
resto4,
resto5 : integer;
diaMes,
diaMesAno: String;
begin
// Para calcular o dia da Páscoa (Domingo), usa-se a fórmula abaixo,
// onde o "ANO" deve ser introduzido com 4 dígitos.
// O operador MOD é o resto da divisão. A fórmula vale para anos entre 1901 e 2099.
// A fórmula pode ser estendida para outros anos, alterando X e Y conforme a tabela a seguir: olhar no site
// http://pt.wikipedia.org/wiki/C%C3%A1lculo_da_P%C3%A1scoa
ano := YearOf(data);
case ano of
2000..2099:
begin
x := 24;
Y := 5;
end;
2100..2199:
begin
x := 24;
y := 6;
end;
2200..2299:
begin
x := 25;
y := 7;
end;
end;
resto1 := ano mod 19;
resto2 := ano mod 4;
resto3 := ano mod 7;
resto4 := ((19 * resto1) + x) mod 30;
resto5 := ((2 * resto2) + (4 * resto3) + (6 * resto4) + y) mod 7;
if (resto4 + resto5) < 10 then
begin
dia := (resto4 + resto5 + 22);
mes := 3;
end
else
begin
dia := (resto4 + resto5 - 9);
mes := 4;
end;
diaMes := FormatFloat('00', dia) + '/' + FormatFloat('00', mes);
// 1. quando o domingo de Páscoa calculado for em 26 de Abril, corrige-se para uma semana antes, ou seja, 19 de Abril.
// 2. quando o domingo de Páscoa calculado for em 25 de Abril e d=28 e a>10, então a Páscoa é em 18 de Abril.
if (diaMes = '26/04') then
diaMes := '19/04'
else if (diaMes = '25/04') and (resto4 = 25) and (resto1 > 10) then
diaMes := '18/04';
// descobrimos a data da pascoa , agora temos que descontar 2 para chegar na sexta que seria a sexta-feria santa
diaMesAno := FormatDateTime('dd/mm/yyyy', IncDay(StrToDate(diaMes + '/' + formatFloat('0000', ano)), -2));
Result := diaMesAno;
end;
// corpus christi
function CorpusChristi(data: TDate): string;
var
sextaSanta: string;
begin
// Para calcular a Quinta-feira de Corpus Christi, soma-se 60 dias ao Domingo de Páscoa, 58 pois considera-se a sexta feira.
sextaSanta := SextaFeiraSanta(data);
Result := FormatDateTime('dd/mm/yyyy', IncDay(StrToDate(sextaSanta), 62));
end;
// Carnaval
function Carnaval(data: TDate): string;
var
sextaSanta: string;
begin
// Para calcular a Terça-feira de Carnaval, basta subtrair 47 dias do Domingo de Páscoa, 45 pois considera a sexta.
sextaSanta := SextaFeiraSanta(data);
Result := FormatDateTime('dd/mm/yyyy', IncDay(StrToDate(sextaSanta), - 45));
end;
var
dataAux: string;
begin
// Rotina que verifica se um determinado dia cai nos feriados relacionados abaixo:
// Se acaso cair, acrescentar sempre um dia a mais, não considerar sabados e domingos;
{01/01 - Confraternização Universal
21/04 - Tiradentes
01/05 - Dia do Trabalho
07/09 - Independência do Brasil
12/10 - Nossa Senhora Aparecida
02/11 - Finados
15/11 - Proclamação da República
25/12 - Natal
??/?? - Pascoa (a calcular) // rever (Sesxta-Feira Santa)
??/?? - Corpus Christi (a calcular) Para calcular a Quinta-feira de Corpus Christi, soma-se 60 dias ao Domingo de Páscoa.
??/?? - Feriado carnaval (a calcular) Para calcular a Terça-feira de Carnaval, basta subtrair 47 dias do Domingo de Páscoa.}
// Pegar somente o dd/mm
dataAux := FormatDateTime('dd/mm', data);
// Confraternização Universal
if (dataAux = '01/01') then
result := TratarFinalSemana(IncDay(data, 1))
// Tiradentes
else if (dataAux = '21/04') then
Result := TratarFinalSemana(IncDay(data, 1))
// Dia do Trabalho
else if (dataAux = '01/05') then
Result := TratarFinalSemana(IncDay(data, 1))
// Independência do Brasil
else if (dataAux = '07/09') then
Result := TratarFinalSemana(IncDay(data, 1))
// Nossa Senhora Aparecida
else if (dataAux = '12/10') then
Result := TratarFinalSemana(IncDay(data, 1))
// Finados
else if (dataAux = '02/11') then
Result := TratarFinalSemana(IncDay(data, 1))
// Proclamação da República
else if (dataAux = '15/11') then
Result := TratarFinalSemana(IncDay(data, 1))
// Natal
else if (dataAux = '25/12') then
Result := TratarFinalSemana(IncDay(data, 1))
// Sexta - Feira Santa = acrescenta + 3 para cair na segunda - feira
else if FormatDateTime('dd/mm/yyyy', data) = (SextaFeiraSanta(data)) then
Result := IncDay(data, 3)
// Corpus Christi
// Para calcular a Quinta-feira de Corpus Christi, soma-se 60 dias ao Domingo de Páscoa, 62 pois considera-se a sexta feira.
else if FormatDateTime('dd/mm/yyyy', data) = CorpusChristi(data) then
Result := TratarFinalSemana(IncDay(data, 1))
// Terça- Feria de carnaval
// Para calcular a Terça-feira de Carnaval, basta subtrair 47 dias do Domingo de Páscoa, 45 pois considera a sexta.
else if FormatDateTime('dd/mm/yyyy', data) = Carnaval(data) then
Result := TratarFinalSemana(IncDay(data, 1))
// Nenhuma -> somente verificar o final de semana
else
Result := TratarFinalSemana(data)
end;