Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 12 de Setembro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
154 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Dicas]  Adicional Noturno - Folha de Pagamento
Publicado por crkronus : Segunda, Janeiro 19, 2009 - 05:55 GMT-3 (2089 leituras)
Comentários 4 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Administrador 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



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: pauloroger (pauloaccess@bol.com.br) : Jan 21, 2009 - 07:31
(Informações sobre o membro | Enviar uma mensagem) http://
Show de Bola, parabens, muito bem elaborado.


por: MattMurdock (gustavoesilvestrini@yahoo.com.br) : Jan 21, 2009 - 05:53
(Informações sobre o membro | Enviar uma mensagem) http://http://
Belo código


por: allvjr (allvjr@terra.com.br) : Fev 13, 2009 - 05:47
(Informações sobre o membro | Enviar uma mensagem)
Maravilhoso. Excelente post.


por: Rumao (adilsonrumao@gmail.com) : Dez 04, 2015 - 10:23
(Informações sobre o membro | Enviar uma mensagem) http://
Olá bom dia será que você teria uma rotina para calcular as horas normais de um funcionário? Onde gere se teve atrasos, faltas ou horas extras?

Se tiver poderia compartilhar? De antemão muito obrigado.
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados