Cartao de Ponto Eletronico

Alguém tem exemplo sobre calculo de horas trabalhadas (cartão de ponto) extraindo também de uma faixa de horário as horas noturnas trabalhadas?
Exemplo: 21:45 as 02:05 e de 03:00 as 08:00
Considerando que a faixa de adicional noturno é
20:00 as 07:00 então ficou:
8:20 de adicional noturno.
9:20 trabalhadas

// Defina os horários dos períodos
$inicio1 = new DateTime(‘21:45’);
$fim1 = new DateTime(‘02:00’);
$inicio2 = new DateTime(‘03:00’);
$fim2 = new DateTime(‘08:00’);

// Defina o período de adicional noturno
$inicioAdicionalNoturno = new DateTime(‘20:00’);
$fimAdicionalNoturno = new DateTime(‘07:00’);

// Função para calcular as horas noturnas em um período
function calcularHorasNoturnas($inicio, $fim, $inicioAdicionalNoturno, $fimAdicionalNoturno) {
$horasNoturnas = 0;

// Verifica se o período se sobrepõe ao adicional noturno
if ($fim > $inicioAdicionalNoturno && $inicio < $fimAdicionalNoturno) {
    $inicio = max($inicio, $inicioAdicionalNoturno);
    $fim = min($fim, $fimAdicionalNoturno);

    // Calcula as horas noturnas
    $intervalo = $inicio->diff($fim);
    $horasNoturnas = $intervalo->h + $intervalo->i / 60;
}

return $horasNoturnas;

}

// Calcula as horas diurnas para cada período
$horasDiurnas1 = $fim1->diff($inicio1)->h + $fim1->diff($inicio1)->i / 60;
$horasDiurnas2 = $fim2->diff($inicio2)->h + $fim2->diff($inicio2)->i / 60;

// Calcula as horas noturnas para cada período
$horasNoturnas1 = calcularHorasNoturnas($inicio1, $fim1, $inicioAdicionalNoturno, $fimAdicionalNoturno);
$horasNoturnas2 = calcularHorasNoturnas($inicio2, $fim2, $inicioAdicionalNoturno, $fimAdicionalNoturno);

// Calcula o total de horas diurnas e noturnas
$totalHorasDiurnas = $horasDiurnas1 + $horasDiurnas2;
$totalHorasNoturnas = $horasNoturnas1 + $horasNoturnas2;

// Exibe os resultados
echo “Horas Diurnas Trabalhadas: $totalHorasDiurnas horas
”;
echo “Horas Noturnas Trabalhadas: $totalHorasNoturnas horas”;

Adriano,
Obrigado pela atenção ao tópico.

Eu ajustei e coloquei para rodar mas não retornou as horas calculadas. Poderia fazer os testes?

veja meus ajustes:

<?php // Defina os horários dos períodos $inicio1 = new DateTime("21:45"); $fim1 = new DateTime("02:00"); $inicio2 = new DateTime("03:00"); $fim2 = new DateTime("08:00"); // Defina o período de adicional noturno $inicioAdicionalNoturno = new DateTime("20:00"); $fimAdicionalNoturno = new DateTime("07:00"); // Função para calcular as horas noturnas em um período function calcularHorasNoturnas($inicio, $fim, $inicioAdicionalNoturno, $fimAdicionalNoturno) { $horasNoturnas = 0; // Verifica se o período se sobrepõe ao adicional noturno if ($fim > $inicioAdicionalNoturno && $inicio < $fimAdicionalNoturno) { $inicio = max($inicio, $inicioAdicionalNoturno); $fim = min($fim, $fimAdicionalNoturno); // Calcula as horas noturnas $intervalo = $inicio->diff($fim); $horasNoturnas = $intervalo->h + $intervalo->i / 60; } return $horasNoturnas; } // Calcula as horas diurnas para cada período $horasDiurnas1 = $fim1->diff($inicio1)->h + $fim1->diff($inicio1)->i / 60; $horasDiurnas2 = $fim2->diff($inicio2)->h + $fim2->diff($inicio2)->i / 60; // Calcula as horas noturnas para cada período $horasNoturnas1 = calcularHorasNoturnas($inicio1, $fim1, $inicioAdicionalNoturno, $fimAdicionalNoturno); $horasNoturnas2 = calcularHorasNoturnas($inicio2, $fim2, $inicioAdicionalNoturno, $fimAdicionalNoturno); // Calcula o total de horas diurnas e noturnas $totalHorasDiurnas = $horasDiurnas1 + $horasDiurnas2; $totalHorasNoturnas = $horasNoturnas1 + $horasNoturnas2; // Exibe os resultados echo "Horas Diurnas Trabalhadas: ".$totalHorasDiurnas; ?>
<?php echo "Horas Noturnas Trabalhadas: ".$totalHorasNoturnas; ?>

Olá boa tarde tudo bem segue exemplo simples para o calculo desejado, mas da forma como eu entendi e se tiver algo errado comenta por favor. espero que ajude o senhor.

// Defina as variáveis de início e fim para cada turno
$inicio1 = strtotime("21:45");
$fim1 = strtotime("02:00");

$inicio2 = strtotime("03:00");
$fim2 = strtotime("08:00");

// Calcule as horas trabalhadas para cada turno
$horas_trabalhadas1 = ($fim1 < $inicio1) ? ($fim1 + 86400 - $inicio1) : ($fim1 - $inicio1);
$horas_trabalhadas2 = ($fim2 < $inicio2) ? ($fim2 + 86400 - $inicio2) : ($fim2 - $inicio2);

// Calcule o total de horas trabalhadas
$total_horas_trabalhadas = ($horas_trabalhadas1 + $horas_trabalhadas2) / 3600;

// Verifique se há adicional noturno
$adicional_noturno = 0;

// Verifique se o horário está dentro do período noturno (22:00 às 05:00)
if ((date("H", $inicio1) >= 22 || date("H", $fim1) <= 5) && date("H", $fim1) <= 5) {
    $adicional_noturno += $horas_trabalhadas1 * 0.2; // Adicional noturno de 20%
}

if ((date("H", $inicio2) >= 22 || date("H", $fim2) <= 5) && date("H", $fim2) <= 5) {
    $adicional_noturno += $horas_trabalhadas2 * 0.2; // Adicional noturno de 20%
}

// Calcule o total de horas trabalhadas com adicional noturno
$total_horas_com_adicional = $total_horas_trabalhadas + ($adicional_noturno / 3600);

// Exiba os resultados
echo "Horas Trabalhadas: " . gmdate("H:i", $total_horas_trabalhadas * 3600) . "<br>";
echo "Adicional Noturno: " . gmdate("H:i", $adicional_noturno) . "<br>";
echo "Total com Adicional Noturno: " . gmdate("H:i", $total_horas_com_adicional * 3600);