Olá Amigos! Confesso que tive muita dificuldade para criar esta rotina de cálculo da quantidade de horas do adicional noturno, mas ao terminá-la, resolvi compartilhar com vocês. Caso alguém tenha melhorias ou sugestões, por favor, entre em contato
// Esta função recebe os horários do Ponto do funcionário (usar '00:00' para Hs extras
// caso não tenha feito nenhuma.
Function TForm1.CalcularADN(HEntrada:string; HSaidaAlmoco:string; HEntradaAlmoco: string;
HSaida:string; HExtraEntrada:string; HExtraSaida:string): String;
var vTotalMinutosDia: Integer;
vHESaida: Integer;
vHEEntrada: Integer;
vSaida: Integer;
vEntradaAlmoco: Integer;
vSaidaAlmoco: Integer;
vEntrada: Integer;
vTotalMinutos: Integer;
vSobraMinutos: Double;
vTotalMinutosX: Integer;
vSobraMinutosX: Double;
vTotalHoras: double;
vTotalHorasX: double;
begin
vTotalMinutos := 0;
////////////////////////////////////////////////////////////////
//////////////////TESTA O PRIMEIRO PERÍODO (ADN)////////////////
////////////////////////////////////////////////////////////////
if (HEntrada <> '') and (HEntrada <> ' : ') then
begin
vEntradaAlmoco := (StrToInt(Copy(HEntrada,1,2))*60)+StrToInt(Copy(HEntrada,4,2));
//ENTROU DEPOIS DAS 10 DA NOITE
if vEntradaAlmoco >= 1320 then //ENTROU DEPOIS DAS 22
begin
vSaida := (StrToInt(Copy(HSaidaAlmoco,1,2))*60)+StrToInt(Copy(HSaidaAlmoco,4,2));
//SAIU DEPOIS DAS 10 DA NOITE E ANTES DA MEIA-NOITE
if vSaida > 1320 then
vTotalMinutos := vTotalMinutos+(vSaida-vEntradaAlmoco);
//SAIU DEPOIS DAS 10 DA NOITE E ANTES DAS 5 DA MANHÃ
if vSaida <= 300 then
begin
vTotalMinutos := vTotalMinutos+(1440-vEntradaAlmoco);
vTotalMinutos := vTotalMinutos+vSaida;
end;
if (vSaida > 300) and (vSaida < 1320) then
begin
vTotalMinutos := vTotalMinutos+(1440-vEntradaAlmoco);
vTotalMinutos := vTotalMinutos+300;
end;
end
else
//ENTROU ANTES DAS 22hs
begin
//Testa se saiu depois das 05 da manhã também
vSaida := (StrToInt(Copy(HSaidaAlmoco,1,2))*60)+StrToInt(Copy(HSaidaAlmoco,4,2));
//SAIU ANTES DA MEIA NOITE
if vSaida >= 1320 then
begin
vTotalMinutos := vTotalMinutos+(vSaida-1320);
end;
if vSaida <= 300 then
begin
if vSaida > vEntradaAlmoco then
vTotalMinutos := vTotalMinutos+(vSaida-vEntradaAlmoco)
else
vTotalMinutos := vTotalMinutos+(120+vSaida);
end
else
begin
if vSaida < vEntradaAlmoco then
vTotalMinutos := vTotalMinutos+420;
if (vEntradaAlmoco < 300) and (vSaida > 300) then
vTotalMinutos := vTotalMinutos+(300-vEntradaAlmoco);
end;
end;
end;
////////////////////////////////////////////////////////////////
//////////////////TESTA O SEGUNDO PERÍODO (ADN)////////////////
////////////////////////////////////////////////////////////////
if (HEntradaAlmoco <> '') and (HEntradaAlmoco <> ' : ') then
begin
vEntradaAlmoco := (StrToInt(Copy(HEntradaAlmoco,1,2))*60) +
StrToInt(Copy(HEntradaAlmoco,4,2));
//ENTROU DEPOIS DAS 10 DA NOITE
if vEntradaAlmoco >= 1320 then //ENTROU DEPOIS DAS 22
begin
vSaida := (StrToInt(Copy(HSaida,1,2))*60)+StrToInt(Copy(HSaida,4,2));
//SAIU DEPOIS DAS 10 DA NOITE E ANTES DA MEIA-NOITE
if vSaida > 1320 then
vTotalMinutos := vTotalMinutos+(vSaida-vEntradaAlmoco);
//SAIU DEPOIS DAS 10 DA NOITE E ANTES DAS 5 DA MANHÃ
if vSaida <= 300 then
begin
vTotalMinutos := vTotalMinutos+(1440-vEntradaAlmoco);
vTotalMinutos := vTotalMinutos+vSaida;
end;
if (vSaida > 300) and (vSaida < 1320) then
begin
vTotalMinutos := vTotalMinutos+(1440-vEntradaAlmoco);
vTotalMinutos := vTotalMinutos+300;
end;
end
else
//ENTROU ANTES DAS 10 DA NOITE
begin
//Testa se saiu depois das 05 da manhã também
vSaida := (StrToInt(Copy(HSaida,1,2))*60)+StrToInt(Copy(HSaida,4,2));
//SAIU ANTES DA MEIA NOITE
if vSaida >=1320 then
begin
vTotalMinutos := vTotalMinutos+(vSaida-1320);
end;
if vSaida <=300 then
begin
if vSaida > vEntradaAlmoco then
vTotalMinutos := vTotalMinutos+(vSaida-vEntradaAlmoco)
else
vTotalMinutos := vTotalMinutos+(120+vSaida);
end
else
begin
if vSaida < vEntradaAlmoco then
vTotalMinutos := vTotalMinutos+420;
if (vEntradaAlmoco < 300) and (vSaida > 300) then
vTotalMinutos := vTotalMinutos+(300-vEntradaAlmoco);
end;
end;
end;
////////////////////////////////////////////////////////////////
//////////////////TESTA O TERCEIRO PERÍODO (ADN)////////////////
////////////////////////////////////////////////////////////////
if (HExtraEntrada <> '') and (HExtraEntrada <> ' : ') then
begin
vEntradaAlmoco := (StrToInt(Copy(HExtraEntrada,1,2))*60)+StrToInt(Copy(HExtraEntrada,4,2));
//ENTROU DEPOIS DAS 10 DA NOITE
if vEntradaAlmoco >= 1320 then //ENTROU DEPOIS DAS 22
begin
vSaida := (StrToInt(Copy(HExtraSaida,1,2))*60)+StrToInt(Copy(HExtraSaida,4,2));
//SAIU DEPOIS DAS 10 DA NOITE E ANTES DA MEIA-NOITE
if vSaida >1320 then
vTotalMinutos := vTotalMinutos+(vSaida-vEntradaAlmoco);
//SAIU DEPOIS DAS 10 DA NOITE E ANTES DAS 5 DA MANHÃ
if vSaida <=300 then
begin
vTotalMinutos := vTotalMinutos+(1440-vEntradaAlmoco);
vTotalMinutos := vTotalMinutos+vSaida;
end;
if (vSaida > 300) and (vSaida < 1320) then
begin
vTotalMinutos := vTotalMinutos+(1440-vEntradaAlmoco);
vTotalMinutos := vTotalMinutos+300;
end;
end
else
//ENTROU ANTES DAS 10 DA NOITE
begin
//Testa se saiu depois das 05 da manhã também
vSaida := (StrToInt(Copy(HExtraSaida,1,2))*60)+StrToInt(Copy(HExtraSaida,4,2));
//SAIU ANTES DA MEIA NOITE
if vSaida >=1320 then
begin
vTotalMinutos := vTotalMinutos+(vSaida-1320);
end;
if vSaida <=300 then
begin
if vSaida > vEntradaAlmoco then
vTotalMinutos := vTotalMinutos+(vSaida-vEntradaAlmoco)
else
vTotalMinutos := vTotalMinutos+(120+vSaida);
end
else
begin
if vSaida < vEntradaAlmoco then
vTotalMinutos := vTotalMinutos+420;
if (vEntradaAlmoco < 300) and (vSaida > 300) then
vTotalMinutos := vTotalMinutos+(300-vEntradaAlmoco);
end;
end;
end;
//CALCULO FINAL ADN
if vTotalMinutos > 0 then
begin
vSobraMinutos := ((vTotalMinutos)) mod 60;
vTotalHoras := ((vTotalMinutos)-vSobraMinutos)/60;
Result := FormatFloat('00',vTotalHoras) + ':'+FormatFloat('00',vSobraMinutos);
end
else
Result := '00:00';
end;
Abraços!
Por: crkronus
Contato: crkronus@gmail.com
|