alleskann 0 Denunciar post Postado Agosto 14, 2010 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
netShot 1 Denunciar post Postado Agosto 14, 2010 Como você está tentando fazer o cálculo? poste algo para que possamos te ajudar... Compartilhar este post Link para o post Compartilhar em outros sites
alleskann 0 Denunciar post Postado Agosto 14, 2010 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
Bruno Augusto 417 Denunciar post Postado Agosto 15, 2010 @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
alleskann 0 Denunciar post Postado Agosto 15, 2010 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
Bruno Augusto 417 Denunciar post Postado Agosto 15, 2010 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
alleskann 0 Denunciar post Postado Agosto 16, 2010 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
Victor Cometti 8 Denunciar post Postado Agosto 16, 2010 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
netShot 1 Denunciar post Postado Agosto 16, 2010 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
Victor Cometti 8 Denunciar post Postado Agosto 16, 2010 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
Bruno Augusto 417 Denunciar post Postado Agosto 17, 2010 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
Jonybrasil 0 Denunciar post Postado Março 19, 2014 Oi a todos espero que posam me ajudar, estou precisando de um codigo que faça esa função alguem podia postar o codigo por favor. Valeu um abraço. Compartilhar este post Link para o post Compartilhar em outros sites
hufersil 145 Denunciar post Postado Março 19, 2014 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
Jonybrasil 0 Denunciar post Postado Março 22, 2014 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