Ir para conteúdo
Fórum Script Brasil
  • 0

Erro no calculo de horas trabalhadas horas extras e horas atraso


Weslley Brum

Pergunta

Boa tarde a todos,

sou iniciante em programação com PHP e estou tentando fazer um calculo porem, meu código calcula e grana no banco de dados a hora errada.
vou deixar meu código abaixo e espero que alguém me ajude .

 

<?php
include('includes/db_config.php');

// Inicializar a variável $result
$result = "";

$data = json_decode(file_get_contents("php://input"), true);
if (isset($data['matricula']) && isset($data['nextField'])) {
    $matricula = $data['matricula'];
    $nextField = $data['nextField'];

    try {
        // Configuração do fuso horário para Brasília
        date_default_timezone_set('America/Sao_Paulo');

        $query = "SELECT * FROM registros_ponto WHERE matricula = :matricula AND DATE(data_registro) = CURDATE()";
        $statement = $pdo->prepare($query);
        $statement->bindParam(':matricula', $matricula);
        $statement->execute();

        if ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
            $fieldsToUpdate = ['entrada1', 'saida1', 'entrada2', 'saida2'];
            $fieldToUpdate = null;

            foreach ($fieldsToUpdate as $field) {
                if (empty($row[$field])) {
                    $fieldToUpdate = $field;
                    break;
                }
            }

            if ($fieldToUpdate !== null) {
                // Obter a data e hora atual no fuso horário de Brasília
                $now = new DateTime("now", new DateTimeZone("America/Sao_Paulo"));
                $dataHora = $now->format("Y-m-d H:i:s");

                // Atualiza o campo com a hora no fuso horário de Brasília
                $updateQuery = "UPDATE registros_ponto SET $fieldToUpdate = :dataHora WHERE matricula = :matricula AND DATE(data_registro) = CURDATE()";
                $updateStatement = $pdo->prepare($updateQuery);
                $updateStatement->bindParam(':matricula', $matricula);
                $updateStatement->bindParam(':dataHora', $dataHora);
                $updateStatement->execute();

                // Calcular horas trabalhadas
                $entrada1 = strtotime($row['entrada1']);
                $saida1 = strtotime($row['saida1']);
                $entrada2 = strtotime($row['entrada2']);
                $saida2 = strtotime($row['saida2']);

                // Calcular as durações dos períodos
                $duracao1 = $saida1 - $entrada1;
                $duracao2 = $saida2 - $entrada2;

                // Calcular as horas trabalhadas
                $horasTrabalhadasSegundos = $duracao1 + $duracao2;
                $horasTrabalhadas = gmdate("H:i:s", $horasTrabalhadasSegundos);

                // Calcular horas de atraso
                $jornadaTrabalhoSegundos = strtotime("09:00:00");
                $horasAtrasoSegundos = $jornadaTrabalhoSegundos - $horasTrabalhadasSegundos;

                // Verificar se há atraso com base na tolerância
                if ($horasAtrasoSegundos > 0) {
                    $horasAtraso = gmdate("H:i:s", $horasAtrasoSegundos);
                } else {
                    $horasAtraso = ""; // "00:00:00" Não há atraso
                }

                // Calcular horas extras
                $horasExtrasSegundos = max($horasTrabalhadasSegundos - $jornadaTrabalhoSegundos, 0);
                $horasExtras = gmdate("H:i:s", $horasExtrasSegundos);

                // Atualizar o campo horas_trabalhadas
                $updateHorasQuery = "UPDATE registros_ponto SET horas_trabalhadas = :horasTrabalhadas WHERE matricula = :matricula AND DATE(data_registro) = CURDATE()";
                $updateHorasStatement = $pdo->prepare($updateHorasQuery);
                $updateHorasStatement->bindParam(':matricula', $matricula);
                $updateHorasStatement->bindParam(':horasTrabalhadas', $horasTrabalhadas);
                $updateHorasStatement->execute();

                // Atualizar o campo horas_atraso
                $updateAtrasoQuery = "UPDATE registros_ponto SET horas_atraso = :horasAtraso WHERE matricula = :matricula AND DATE(data_registro) = CURDATE()";
                $updateAtrasoStatement = $pdo->prepare($updateAtrasoQuery);
                $updateAtrasoStatement->bindParam(':matricula', $matricula);
                $updateAtrasoStatement->bindParam(':horasAtraso', $horasAtraso);
                $updateAtrasoStatement->execute();

                // Atualizar o campo horas_extras
                $updateExtrasQuery = "UPDATE registros_ponto SET horas_extras = :horasExtras WHERE matricula = :matricula AND DATE(data_registro) = CURDATE()";
                $updateExtrasStatement = $pdo->prepare($updateExtrasQuery);
                $updateExtrasStatement->bindParam(':matricula', $matricula);
                $updateExtrasStatement->bindParam(':horasExtras', $horasExtras);
                $updateExtrasStatement->execute();

                // Exibir informações sobre o atraso e horas extras
                $result = "<p class='sucesso'>Registro atualizado com sucesso!</p>";
            } else {
                $result = "Excedeu o número de registros do dia.";
            }
        }
    } catch (PDOException $e) {
        $result = "Erro ao salvar registro: " . $e->getMessage();
    }
} else {
    $result = "Dados de entrada inválidos.";
}

echo $result; // Retorna a mensagem de sucesso ou erro
?>

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

O primeiro problema é a estrutura da tabela, para executar o seu código, eu fiz a tabela registro_pontos assim:

CREATE TABLE `registros_ponto` (
  `id` int NOT NULL AUTO_INCREMENT,
  `matricula` int NOT NULL,
  `data_registro` date DEFAULT NULL,
  `entrada1` time DEFAULT NULL,
  `saida1` time DEFAULT NULL,
  `entrada2` time DEFAULT NULL,
  `saida2` time DEFAULT NULL,
  `horas_trabalhadas` time DEFAULT NULL,
  `horas_atraso` time DEFAULT NULL,
  `horas_extras` time DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

O segundo problema é que você não pode usar a matrícula para atualizar a tabela, você tem que usar a chave primária, no meu caso, eu chamei de id. O id é um número único. Vamos a um exemplo: a empresa tem apenas um funcionário, a matricula dele é 1, mas ele trabalhou no dia 1,2,3...30. Para calcular as horas trabalhadas não podemos usar a matrícula do funcionário, mas a chave primária, ou seja, um número especifico que indica o dia 1, 2, 3, etc.

Eu não sei se o cálculo das horas trabalhadas está certo, mas modifiquei o seu código para trabalhar com apenas um registro:

<?php
// mysql registros_ponto (id int pk ai,matricula int,data_registro date,entrada1 time,
// saida1 time, entrada2 time, saida2 time, horas_trabalhadas time,horas_atraso time,horas_extras time)
// (33,1,'2023-10-21','8:00','12:00','13:00','17:00',null,null,null)
$pdo=new PDO("mysql:hostname=localhost;dbname=laravel","root","");
$query = "SELECT * FROM registros_ponto WHERE matricula = 1";
$stm=$pdo->prepare($query);
$stm->execute();
$rows=$stm->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row){
  // Calcular horas trabalhadas
  $id=$row['id'];
  $entrada1 = strtotime($row['entrada1']);
  $saida1 = strtotime($row['saida1']);
  $entrada2 = strtotime($row['entrada2']);
  $saida2 = strtotime($row['saida2']);
  // Calcular as durações dos períodos
  $duracao1 = $saida1 - $entrada1;
  $duracao2 = $saida2 - $entrada2;
  // Calcular as horas trabalhadas
  $horasTrabalhadasSegundos = $duracao1 + $duracao2;
  $horasTrabalhadas = gmdate("H:i:s", $horasTrabalhadasSegundos);
  // Calcular horas de atraso
  $jornadaTrabalhoSegundos = strtotime("09:00:00");
  $horasAtrasoSegundos = $jornadaTrabalhoSegundos - $horasTrabalhadasSegundos;
  // Verificar se há atraso com base na tolerância
  if ($horasAtrasoSegundos > 0) {
      $horasAtraso = gmdate("H:i:s", $horasAtrasoSegundos);} else {
      $horasAtraso = ""; } // "00:00:00" Não há atraso
  // Calcular horas extras
  $horasExtrasSegundos = max($horasTrabalhadasSegundos - $jornadaTrabalhoSegundos, 0);
  $horasExtras = gmdate("H:i:s", $horasExtrasSegundos);
  // Atualizar o campo horas_trabalhadas, horas_atraso, horas_extras
  $query = "UPDATE registros_ponto SET horas_trabalhadas = :horasTrabalhadas,
    horas_atraso = :horasAtraso, horas_extras = :horasExtras
    WHERE id = :id";
  $stm = $pdo->prepare($query);
  $stm->bindParam(':id', $id);
  $stm->bindParam(':horasTrabalhadas', $horasTrabalhadas);
  $stm->bindParam(':horasAtraso', $horasAtraso);
  $stm->bindParam(':horasExtras', $horasExtras);
  $stm->execute();} 
?>

Para calcular as horas trabalhadas de todo mundo, basta mudar a primeira consulta para "select * from registros_ponto". Não importa a matrícula, essa consulta vai calcular as horas para todos os registros.

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...