Ir para conteúdo

POWERED BY:

Arquivado

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

alleskann

Trabalhar com Adicional Noturno (HORA EXTRA)

Recommended Posts

Bom Dia.

 

Estou desenvolvendo um sistema onde há o ponto eletronico dos funcionários.

 

Exemplo:

 

Roberto Silva

Data de Início: 2010-08-13 12:00:00 (como na tabela)

Data de Término: 2010-08-14 01:00:00 (como na tabela)

Total de Hora Trabalhada: 13:00:00 (no banco de dados está armazenado em segundos)

Hora Contratual: 08:00:00 (valor retirado das 220 horas mensais)

Hora Extra Normal: 02:00:00

Hora Extra c/ Adicional Noturno: 03:00:00

 

O que não estou conseguindo fazer é que o sistema diferencie por exemplo, as horas extras que tiverem adicional noturno das horas extras normais.

Neste caso, identificar as 03:00:00 extras noturnas e as 02:00:00 extras normais.

 

Alguém conhece uma solução? Já tentei de tudo e não consegui.

 

 

Att,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você está tentando fazer o cálculo? poste algo para que possamos te ajudar...

 

 

$DataInicial1 = $EXP_SDATE[2]."/".$EXP_SDATE[1]."/".$EXP_SDATE[0]." ".$F_CASH['StartHour'];
			$DataInicial2 = $EXP_SDATE[2]."/".$EXP_SDATE[1]."/".$EXP_SDATE[0]." 05:00:01";
			$DataInicial3 = $EXP_SDATE[2]."/".$EXP_SDATE[1]."/".$EXP_SDATE[0]." 22:00:01";
			
			$DataFinal1 = $EXP_FDATE[2]."/".$EXP_FDATE[1]."/".$EXP_FDATE[0]." ".$F_CASH['FinishHour'];
			$DataFinal2 = $EXP_FDATE[2]."/".$EXP_FDATE[1]."/".$EXP_FDATE[0]." 05:00:01";
			$DataFinal3 = $EXP_FDATE[2]."/".$EXP_FDATE[1]."/".$EXP_FDATE[0]." 22:00:01";
			
			
			if(((date($DataInicial1) > date($DataInicial2)) && (date($DataInicial1) < date($DataInicial3))) &&
			((date($DataFinal1) > date($DataFinal2)) && (date($DataFinal1) < date($DataFinal3)))) {
				$HoraExtraNoturno = "Não Possui";
				} else {
				$HoraExtraNoturno = "Possui";
				}

eu consigo até definir os períodos que possuem adicional noturno, porém não consigo pegar os intervalos que são noturno.

 

 

Não faço idéia de como conseguir, já revirei este fórum de ponta cabeça pra achar algo, e nada!

 

 

Aguardo reposta!

Compartilhar este post


Link para o post
Compartilhar em outros sites

@alleskann, recomendo que leia, se ainda não leu, ou releia as regras do Fórum:

 

05ª - Post UP!

Favor não postar mensagens com o objetivo de evidenciar o tópico, tornando-o primeiro da lista de tópicos (up), tal como mensagens repetitivas e/ou que não condizem com o assunto do tópico em questão (flood).

Como você armazena essas informações? Cada hora em um campo separado?

 

Uma dica seria você padronizar as datas, assim computar a diferença entre o total de horas trabalhadas com o total contratual, ficaria mais fácil.

 

Uma vez com com essa diferença, voc subtrai o tempo das horas extras normais e o que restar é extra com adicional noturno.

 

Depois bastaria formatar o resultado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe,

não era a meu intento.

 

Seguinte, o campo de data (nomeado STARTDATE) está como DATE e o campo de hora (nomeado STARTHOUR) está como TIME.

Eu não entendi seu raciocínio, mesmo usando data diff ele retornará somente a diferença entre horas. Lembrando que o campo de data final (FINISHDATE) e hora final (FINISHHOUR) estão iguais.

 

Teria como me ajudar? hehe estou totalmente confuso nisso!

 

Att,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você armazena essas informações? Cada hora em um campo separado?

 

...

 

Uma vez com com essa diferença, você subtrai o tempo das horas extras normais e o que restar é extra com adicional noturno.

Quando perguntei como você está armazenando foi justamente pensando na segunda parte do texto citado.

 

A diferença de tempo entre Data de Término e Data de Início será o seu Total de Hora Trabalhada.

 

Então você subtrai de Hora Contratual e o tempo resultante serão as horas extras.

 

O problema é que você não demonstrou (ou se o fez eu acabei perdido) como você condiciona uma Hora Extra para ter ou não o Adiconal Noturno.

 

Com o que você passou eu pude compreender que a primeira hora extra é sem adicional e que as outras, a partir da segunda, o terá. É isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso mesmo Imaggens,

este calculo que falou tira hora normal (220 horas mês, escala 5x1 da 7:30 horas diarias) o restante é extra, porém não sei separar o que é extra com adicional noturno (das 22h às 5h da manhã).

 

Meu cliente não quer ter o trabalho de informar por exemplo que naquele período teve 4 horas extras com adicional noturno, ele quer somente ter o trabalho de inserir inicio e fim e o sistema calcular, porém estou com esta dificuldade.

 

Ainda não resolvida..hehe

Já tentei fazer assim oh:

 

if($HORA >= 22) { $extra_noturno = $extra_noturno + 1; }

if($HORA >= 23) { $extra_noturno = $extra_noturno + 1; }

if($HORA <= 00) { $extra_noturno = $extra_noturno + 1; }

if($HORA <= 01) { $extra_noturno = $extra_noturno + 1; }

if($HORA <= 02) { $extra_noturno = $extra_noturno + 1; }

if($HORA <= 03) { $extra_noturno = $extra_noturno + 1; }

if($HORA <= 04) { $extra_noturno = $extra_noturno + 1; }

 

Só que nisso só calculo as horas, e quando há minuto não consigo pega-lo.

 

Alguma luz?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

primeiramente tem q verificar se o inicio da hora extra é noturna (hora_inicial + 8 horas), considerando turno de 8 horas

depois verificar se hora_final eh noturna(se passar de 5 horas da manha já n eh mais noturna)

 

se os dois horarios forem noturnos subtrai hora_final da hora_inicial mais 8 horas

se hora_inicial + 8 horas n for noturna e hora_final for noturna subtrai hora_final - 22:00:00(horário de inicio da hora noturna)

se hora_inicial + 8 horas for noturna e hora_final não for noturna subtrai 05:00:00(horário de fim da hora noturna) - hora_inicial + 8

se hora_inicial + 8 horas n for noturna e hora_final tbm n for, verificar se passou pelo noturno (ex: começou hora extra as 21:00 e acabou as 06:00), 7 horas extras noturnas

e por fim subtrai as horas extras pelas horas noturnas e acha as horas normais

 

eu já fiz um codigo parecido mas era para verificar horas extras a 50% e 100%

 

espero ter ajudado

Compartilhar este post


Link para o post
Compartilhar em outros sites

primeiramente tem q verificar se o inicio da hora extra é noturna (hora_inicial + 8 horas), considerando turno de 8 horas

depois verificar se hora_final eh noturna(se passar de 5 horas da manha já n eh mais noturna)

 

se os dois horarios forem noturnos subtrai hora_final da hora_inicial mais 8 horas

se hora_inicial + 8 horas n for noturna e hora_final for noturna subtrai hora_final - 22:00:00(horário de inicio da hora noturna)

se hora_inicial + 8 horas for noturna e hora_final não for noturna subtrai 05:00:00(horário de fim da hora noturna) - hora_inicial + 8

se hora_inicial + 8 horas n for noturna e hora_final tbm n for, verificar se passou pelo noturno (ex: começou hora extra as 21:00 e acabou as 06:00), 7 horas extras noturnas

e por fim subtrai as horas extras pelas horas noturnas e acha as horas normais

 

eu já fiz um codigo parecido mas era para verificar horas extras a 50% e 100%

 

espero ter ajudado

 

A questão de passar as 5:00 não ser noturna é relativo jornada de trabalho do camarada.

 

Por exemplo, se ele cumpre jornada noturna ( entra as 22:00 e sai as 5:00 por exemplo ) e sai as 07:00, o período de 05:00 as 07:00 será considerada noturna, conforme entendimento do TST (Súm. 60, II), "cumprida integralmente a jornada no período noturno e prorrogada esta, devido é, também, o adicional quanto às horas prorrogadas." e ainda também será hora extra.

 

 

Acredito que deva considerar da uma lida em algum artigo ou algo do tipo a respeito de adicional noturno, afim de, entender os cálculos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eh!! n pensei na possibilidade das horas extras continuas quando trabalhas as 7 horas noturnas consecutivas.

 

eu trabalho no RH conheço perfeitamente do que se trata.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, considerando o que eu disse antes da pergunta final no post #6, veja o que o exemplo abaixo retorna:

 

$now = new DateTime;

$diff = $now -> diff( new DateTime( date( 'Y-m-d', strtotime( '+5 hours' ) ) ) );

print '<pre>'; print_r( $diff );

/**
Saída:

DateInterval Object
(
   [y] => 0
   [m] => 0
   [d] => 0
   [h] => 10
   [i] => 13
   [s] => 19
   [invert] => 1
   [days] => 0
)
*/

Peguei a hora atual (10:13:19 de hoje), e comparei a diferença com 5 horas a frente.

 

Veja o que resultou no índice h.

 

Com base nisso que você condicionaria o adicional noturno.

 

Algo mais ou menos assim:

 

/**
* Aqui, $diff não é mais do exemplo acima, e sim do seu DateTime::diff()
* entre as horas final e inicial
*/
$hour = $diff -> h;

if( $hour >= HORA_QUE_O ADICIONAL_COMEÇA_POR_LEI &&
   $hour <= HORA_QUE_O_ADICIONAL_TERMINA_POR_LEI ) {

   /**
    * Aqui você verifica se as horas extras (Horas Trabalhadas menos Horas Contratuais),
    * usando DateTime::sub() é igual a UM (extra sem adicional) ou maior que UM
    * (um extra sem e outos com adicional)
    *
    * Se for UM, você apenas incrementa o salário por hora
    * Se for mais de um você incrementa o salário por hora UMA VEZ e, em seguida
    * incrementa X-1 vezes o salário por hora acrescido do adicional
    *
    * X é o total de horas extras e a subtração de uma hora é para que
    * o cálculo dos adicionais se dê a partir da segunda hora
    */
}

Não sei porque cargas d'água eu respondi dentro de comentários de código, mas tanto faz :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ajudar é uma coisa.

Fazer tudo é outra.

 

A minha ajuda é te mandar a lógica (como outros fizeram), mas a que fiz para testes é com a linguagem plpgsql no PostgreSQL.

Com ele a questão de datas fica mais fácil para testar.

Basta agora ler, estudar e então você será capaz de passar para o PHP.

 

do $
  declare
    vHoraInicio timestamptz := '2014-03-18 08:15:00-03';
    vHoraFim timestamptz := '2014-03-19 03:20:00-03';
    vDataAuxiliar timestamptz;
    vHoraInicioAdicionalNorturno timetz := '22:00:00-03';
    vHoraFimAdicionalNorturno timetz := '04:00:00-03';
    vJornadaContratual interval := '08:00:00';
    vDiff interval;
    vAdicionalNoturno interval := '00:00:00'::interval;
    vMesmoDia boolean := vHoraInicio::DATE = vHoraFim::DATE;
  begin
    vDiff := vHoraFim - vHoraInicio;
    raise notice 'Horas trabalhadas: %', vDiff;

    vDiff := vDiff - vJornadaContratual;

    -- virou a noite trabalhando (coisa normal em TI)
    if vMesmoDia = FALSE then
      raise notice 'Virou a noite';

      if vHoraInicio::timetz > vHoraInicioAdicionalNorturno then
        vDataAuxiliar := vHoraInicio;
      else 
        vDataAuxiliar := vHoraInicio::DATE + vHoraInicioAdicionalNorturno;
      end if;
      
      vAdicionalNoturno := ((vHoraFim::DATE + ' 00:00:00-03'::timetz)::timestamptz - vDataAuxiliar);

      if vHoraFim::timetz < vHoraFimAdicionalNorturno then
        vDataAuxiliar := vHoraFim;
      else 
        vDataAuxiliar := vHoraFim::DATE + vHoraFimAdicionalNorturno;
      end if;

      vAdicionalNoturno := vAdicionalNoturno + vDataAuxiliar - (vHoraFim::DATE + ' 00:00:00-03'::timetz)::timestamptz;
     

    -- nao virou a noite, fez no mesmo dia
    -- vemos se trabalhou para adicional noturno
    else 
       vAdicionalNoturno := vHoraFim - (vHoraInicio::DATE + vHoraInicioAdicionalNorturno)::timestamptz;
       if vAdicionalNoturno < '00:00:00'::interval then
         vAdicionalNoturno := '00:00:00'::interval;
       end if;
    end if;

    if vDiff > '00:00:00'::interval then
      raise notice 'Horas extras: %', vDiff;
    else
      raise notice 'Sem horas extras';
    end if;
    
    raise notice 'Total adicional noturno: %', vAdicionalNoturno;
  end;
$
    

Exemplo da saida:

NOTA:  Horas trabalhadas: 19:05:00
NOTA:  Virou a noite
NOTA:  Horas extras: 11:05:00
NOTA:  Total adicional noturno: 05:20:00

 

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigadão Hugo pela força vai me ajudar bastante, faz pouco que iniciei em php, com o pouco que vou aprendendo vou fazendo, agora nessa parte de horas estou confuso, vamos ver si entendo um pouco essa parte, só me esta faltando essa parte o resto que falta eu sei fazer levo uns dias buscando intensamente quanto mais informaçao mais confuso fico.

Um abraço grande.

 

 

teria como alguém "fazer tudo" como diz nosso amigo hugo, e fazer por um precinho camarada, para eu poder dar continuidade no programa que estou fazendo, pois levo vários dias e não estou conseguindo fazer essa calculadora.

Um forte abraço a todos espero que alguém possa me ajudar não e preguiça sinão que não estou conseguindo mesmo. Obrigado

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.