Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ale (Jundiai)

Calculo de horas

Recommended Posts

Tenho que fazer uma rotina, meio que urgente, mas não estou conseguindo.

 

Na verdade, tem que efetuar um calculo de horas trabalhadas dos funcionarios de uma fabrica. O input e dado com da data/hora inicial e data/hora final.

Nesse intervalo, tem que calcular quantas horas o funcionario trabalhou e quanto ele ganhou, sendo que :

das 8:00 as 18:00 horas - hora normal a 2,00 a hora

das 18:01 as 22:00 horas - 2,00 a hora + extra de 50% sendo 3,00 a hora

das 22:01 as 7:59 horas - 2,00 a hora + adicional noturno de 100% sendo 4,00 a hora

Mas, o funcionario pode passar de 24 horas na empresa (exemplo : entra as 8:00 horas do dia 01/01 e sai as 12:00 horas do dia 02/01, tem horas normais das 8:00 as 18:00 horas + extra das 18:01 as 22:00 + adicional noturno das 22:01 as 7:59 + horas normais das 8:00 as 12:00 horas)

alguém pode me ajudar ??????????????????

Compartilhar este post


Link para o post
Compartilhar em outros sites

o que já fez e onde teve dificuldades?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A minha dificuldade esta em contar as horas separadas.

ex.

um funcionario tem como data de entrada 10/06 as 8:00 horas e data de saida 11/06 as 16:00 horas

entao : das 8:00 as 18:00 horas do dia 10/06 são 10 horas normais

das 18:01 as 24:00 horas do dia 10/06 são 6 horas extras

das 00:01 as 7:59 horas do dia 11/06 são 7,58 horas com adicional noturno

das 8:00 as 16:00 horas do dia 11/06 são 8 horas normais

 

o sistema tem que me dar o seguinte resultado

 

18 horas normais

6 horas extras

7,58 horas com adicional noturno

 

Depois a partir dai, eu consigo fazer o calculo dos valores, eu so nao estou conseguindo fazer essa contagem das horas, separando pelas horas normais, extras e horas com adicional noturno, sendo que o eu tenho 2 dados (data/hora de entrada e data/hora de saida)

Compartilhar este post


Link para o post
Compartilhar em outros sites

olá !!!

 

eu montei uma rotina com algo que possa te dar uma idéia do que você precisa fazer ...

 

e também não testei direito, faça testes aí tbm ...

 

abraço !!!

 

procedure TForm1.Button1Click(Sender: TObject);
var
vEntrada, vSaida: TDateTime;
vHoraNormal, vHoraExtra, vHoraNoturno: integer;
vDias,vHoraI, vHoraF: integer;
I: word;
vResHoraNormal, vResHoraExtra, vResHoraNoturno: string;
begin
		vEntrada:= strtodatetime(edit1.text);
		vSaida:= strtodatetime(edit2.text);
		vHoraNormal:= 0;
		vHoraExtra:= 0;
		vHoraNoturno:= 0;

		//não se esqueça de incluir DateUtils na cláusula uses...
		vDias:= Dayof(vSaida) - Dayof(vEntrada); //captura o número de dias
		vHoraI:= (Hourof(vEntrada)*60) + Minuteof(vEntrada);//em minutos
		vHoraF:= (Hourof(vSaida)*60) + Minuteof(vSaida);//em minutos

		// Entrada e Saída são no mesmo dia ...
		if vDias = 0 then
		begin
				for I:= vHoraI to vHoraF-1 do
				begin
						if (I >= 0) and (I <= 479) then //0:00 as 7:59
								inc(vHoraNoturno);
						if (I >= 480) and (I <= 1080) then //8:00 as 18:00
								inc(vHoraNormal);
						if (I >= 1081) and (I <= 1320) then //18:01 as 22:00
								inc(vHoraExtra);
						if (I >= 1321) and (I <= 1440) then //22:01 as 24:00
								inc(vHoraNoturno);
				end;
		end;
		// Entrada e Saída são dias diferentes ...
		if vDias > 0 then
		begin
				//captura o primeiro dia ...
				for I:= vHoraI to 1439 do
				begin
						if (I >= 0) and (I <= 479) then //0:00 as 7:59
								inc(vHoraNoturno);
						if (I >= 480) and (I <= 1080) then //8:00 as 18:00
								inc(vHoraNormal);
						if (I >= 1081) and (I <= 1320) then //18:01 as 22:00
								inc(vHoraExtra);
						if (I >= 1321) and (I <= 1440) then //22:01 as 24:00
								inc(vHoraNoturno);
				end;
				//captura o último dia ...
				for I:= 0 to vHoraF-1 do
				begin
						if (I >= 0) and (I <= 479) then //0:00 as 7:59
								inc(vHoraNoturno);
						if (I >= 480) and (I <= 1080) then //8:00 as 18:00
								inc(vHoraNormal);
						if (I >= 1081) and (I <= 1320) then //18:01 as 22:00
								inc(vHoraExtra);
						if (I >= 1321) and (I <= 1440) then //22:01 as 24:00
								inc(vHoraNoturno);
				end;
				//adiciona demais dias se houver...
				if (vDias -1) > 0 then
				begin
						inc(vHoraNormal,(10 * (vDias -1)));
						inc(vHoraExtra,(4 * (vDias -1)));
						inc(vHoraNoturno,(10 * (vDias -1)));
				end;
		end;

		//transforma minutos em horas e coloca no resultado...
		vResHoraNormal:= inttostr(trunc(vHoraNormal/60)) + ':' + formatfloat('00',(vHoraNormal - (trunc(vHoraNormal/60)*60)));
		vResHoraExtra:= inttostr(trunc(vHoraExtra/60)) + ':' + formatfloat('00',(vHoraExtra - (trunc(vHoraExtra/60)*60)));
		vResHoraNoturno:= inttostr(trunc(vHoraNoturno/60)) + ':' + formatfloat('00',(vHoraNoturno - (trunc(vHoraNoturno/60)*60)));

showmessage(
'Hora Normal = '+vResHoraNormal+#13+
'Hora Extra = '+vResHoraExtra+#13+
'Hora Noturno = '+vResHoraNoturno);
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.